在 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}}" />
|
特点:
应用场景:
- 控制“登录”和“登出”的切换显示
- 快速反转控件状态
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.Collapsed 或 Visibility.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}}" />
|
支持参数:
应用场景:
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
应用场景:
- 文件管理器、磁盘清理工具等显示文件大小
- 日志系统、监控系统中显示内存占用
示例代码:
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>
|
📚 参考资料