Featured image of post Value Converters

Value Converters

在 WPF、Xamarin.Forms和.NET MAUI开发中,数据绑定是MVVM架构的核心机制。但有时我们希望对绑定的数据进行转换、格式化或逻辑处理,这时候就需要使用 IValueConverter 接口实现值转换器。

在 WPF、Xamarin.Forms 和 .NET MAUI 开发中,数据绑定(Data Binding) 是 MVVM 架构的核心机制。但有时我们希望对绑定的数据进行转换、格式化或逻辑处理,这时候就需要使用 IValueConverter 接口实现值转换器。

ValueConverters.NET 是一个由 Thomas Galliker 维护的开源项目,它提供了一组常用的 IValueConverter 实现,帮助开发者快速构建强大的数据绑定逻辑。


📦 安装方法

你可以通过 NuGet 包安装适用于不同平台的版本:

平台 命令
WPF / WinForms / UWP / Avalonia 等 Install-Package ValueConverters
Xamarin.Forms Install-Package ValueConverters.Forms
.NET MAUI Install-Package ValueConverters.MAUI

✅ 如何使用 ValueConverters.NET?

步骤一:在 XAML 中定义资源

1
2
3
4
<Window.Resources>
    <converters:DateTimeConverter x:Key="DateTimeConverter" Format="d" MinValueString="-"/>
    <converters:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
</Window.Resources>

步骤二:在绑定中使用 Converter

1
2
<TextBlock Text="{Binding BirthDate, Converter={StaticResource DateTimeConverter}}" />
<TextBox Visibility="{Binding IsVisible, Converter={StaticResource BooleanToVisibilityConverter}}" />

🧩 核心 Converters 及其示例

下面介绍几个最常用且实用的转换器及其应用场景。


1. DateTimeConverter:日期格式化

示例代码:

1
2
// ViewModel
public DateTime BirthDate { get; set; } = new DateTime(1990, 5, 20);
1
2
<!-- XAML -->
<TextBlock Text="{Binding BirthDate, Converter={StaticResource DateTimeConverter}, ConverterParameter='yyyy-MM-dd'}" />

支持参数:

  • Format: 指定格式字符串(如 "yyyy-MM-dd"
  • MinValueString: 当值为 DateTime.MinValue 时显示替代文本

应用场景:

  • 显示生日、创建时间等日期字段
  • 处理空日期显示为 -N/A

2. BooleanToVisibilityConverter:布尔值转可见性

示例代码:

1
2
// ViewModel
public bool IsBusy { get; set; } = true;
1
2
<!-- XAML -->
<ProgressBar Visibility="{Binding IsBusy, Converter={StaticResource BooleanToVisibilityConverter}}" />

支持参数:

  • TrueValue: true 时返回的值(默认 Visibility.Visible
  • FalseValue: false 时返回的值(默认 Visibility.Collapsed

应用场景:

  • 控制按钮、进度条、加载动画的显示隐藏
  • 动态切换控件状态

3. EnumWrapperConverter:枚举本地化展示

示例代码:

1
2
3
4
5
6
7
8
// 枚举定义
public enum PartyMode
{
    [Display(Name = "PartyMode_Off", ResourceType = typeof(PartyModeResources))]
    Off,
    [Display(Name = "PartyMode_On", ResourceType = typeof(PartyModeResources))]
    On
}
1
2
// ViewModel
public PartyMode Mode { get; set; } = PartyMode.On;
1
2
<!-- XAML -->
<Label Content="{Binding Mode, Converter={StaticResource EnumWrapperConverter}}" />

支持特性:

  • 使用 [Display] 注解配合 .resx 资源文件实现多语言支持
  • 自动识别当前 CurrentUICulture

应用场景:

  • 国际化应用中的下拉菜单、状态标签
  • 将枚举值以用户友好的方式展示

4. InvertBooleanConverter:取反布尔值

示例代码:

1
2
// ViewModel
public bool IsLoggedIn { get; set; } = false;
1
2
<!-- XAML -->
<Button Content="登录" Visibility="{Binding IsLoggedIn, Converter={StaticResource InvertBooleanConverter}}" />

特点:

  • 直接将 true 变为 false,反之亦然

应用场景:

  • 控制“登录”和“登出”的切换显示
  • 快速反转控件状态

5. NullToVisibilityConverter:空值控制可见性

示例代码:

1
2
// ViewModel
public string UserName { get; set; } = null;
1
2
3
<!-- XAML -->
<TextBlock Text="{Binding UserName}" 
           Visibility="{Binding UserName, Converter={StaticResource NullToVisibilityConverter}}" />

支持参数:

  • WhenNull: 设置为 Visibility.CollapsedVisibility.Hidden
  • WhenNotNull: 同上

应用场景:

  • 隐藏空字段
  • 控制非空内容的显示

6. EnumToBooleanConverter:枚举匹配判断布尔值

示例代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// 枚举
public enum UserLevel
{
    Guest,
    Member,
    Admin
}

// ViewModel
public UserLevel Level { get; set; } = UserLevel.Admin;
1
2
3
<!-- XAML -->
<Button Content="删除用户"
        Visibility="{Binding Level, Converter={StaticResource EnumToBooleanConverter}, ConverterParameter=Admin}" />

应用场景:

  • 根据角色权限显示/隐藏按钮
  • 枚举匹配时启用某些操作

7. MultiBindingConverters:多个绑定值组合转换

示例:根据两个布尔值决定是否启用按钮

1
2
3
4
5
6
7
8
<Button Content="提交">
    <Button.Visibility>
        <MultiBinding Converter="{StaticResource BooleanAndToVisibilityConverter}">
            <Binding Path="IsFormValid" />
            <Binding Path="IsNetworkAvailable" />
        </MultiBinding>
    </Button.Visibility>
</Button>

支持的 MultiConverter:

  • BooleanAndConverter
  • BooleanOrConverter
  • BooleanXorConverter
  • BooleanAndToVisibilityConverter
  • BooleanOrToVisibilityConverter

应用场景:

  • 多条件判断控件状态
  • 表单验证联动控制

8. ImageSourceConverter:图像路径转 ImageSource

示例代码:

1
2
// ViewModel
public string AvatarPath { get; set; } = "Images/avatar.png";
1
2
<!-- XAML -->
<Image Source="{Binding AvatarPath, Converter={StaticResource ImageSourceConverter}}" />

支持参数:

  • 支持相对路径、绝对路径、Base64 图像等

应用场景:

  • 数据绑定图像地址
  • 动态加载头像、图标等

9. FileSizeToStringConverter:字节大小自动转 KB/MB/GB

示例代码:

1
2
// ViewModel
public long FileSize { get; set; } = 1024 * 1024 * 10; // 10 MB
1
2
<!-- XAML -->
<TextBlock Text="{Binding FileSize, Converter={StaticResource FileSizeToStringConverter}}" />

输出结果:10.00 MB

应用场景:

  • 文件管理器、磁盘清理工具等显示文件大小
  • 日志系统、监控系统中显示内存占用

10. StringFormatConverter:自定义字符串格式化

示例代码:

1
2
// ViewModel
public decimal Price { get; set; } = 99.99m;
1
2
<!-- XAML -->
<TextBlock Text="{Binding Price, Converter={StaticResource StringFormatConverter}, ConverterParameter='{}{0:C}'}" />

输出结果:$99.99(根据文化设置)

应用场景:

  • 货币、百分比、数字格式化显示
  • 支持动态格式模板

🌍 文化敏感支持(Culture Awareness)

所有转换器都支持文化感知:

1
2
// 在 App.xaml.cs 或初始化时配置
ValueConvertersConfig.DefaultPreferredCulture = ConverterCulture.CurrentUICulture;

你也可以在运行时更改语言并刷新界面:

1
Thread.CurrentThread.CurrentUICulture = new CultureInfo("zh-CN");


📦 总结

转换器名称 功能 应用场景
DateTimeConverter 日期格式化 时间戳展示
BooleanToVisibilityConverter 布尔转可视性 控件显示隐藏
EnumWrapperConverter 枚举本地化 下拉框、状态栏
InvertBooleanConverter 布尔取反 控件状态反转
NullToVisibilityConverter 空值控制可视性 隐藏空字段
EnumToBooleanConverter 枚举匹配布尔 权限控制
ImageSourceConverter 字符串路径转图像源 图像绑定
FileSizeToStringConverter 字节数大小转易读格式 文件信息展示
StringFormatConverter 字符串格式化 货币、百分比
BooleanAndConverter, BooleanOrConverter 多个布尔值逻辑运算 表单验证

🧩 结语:为什么推荐使用 ValueConverters.NET?

  • ✅ 提供了常见场景下的高质量 IValueConverter 实现
  • ✅ 支持多语言、文化敏感
  • ✅ 支持 WPF、Xamarin.Forms、MAUI 等主流 UI 框架
  • ✅ 可扩展性强,易于封装复用
  • ✅ 减少 Code-Behind,增强 MVVM 解耦能力

📦 推荐使用方式

安装包:

1
PM> Install-Package ValueConverters

全局注册(App.xaml):

1
2
3
4
<Application.Resources>
    <converters:BooleanToVisibilityConverter x:Key="BoolToVisConverter"/>
    <converters:DateTimeConverter x:Key="DateTimeConverter" Format="yyyy-MM-dd"/>
</Application.Resources>

📚 参考资料


Licensed under CC BY-NC-SA 4.0
Built with Hugo
Theme Stack designed by Jimmy