WPF中Binding的数据转换—ValueConverters
在WPF中使用Binding经常会遇到需要转换的情况,如bool转为visibility,通常情况需要自己写一个类继承自IValueConverter
接口,使用详情请参见Binding对数据的转换和校验,这种方法虽然不难,但是在用XAML写界面时,需要大量的创建自定义转换器,这样代码就显得不够优雅,本文推荐一个Nuget包来解决这个问题。
首先安装Nuget包ValueConverters
,该包中已经涵盖了日常开发中常用的转换器,如BoolToVisibilityConverter
、StringIsNotNullOrEmptyConverter
、IsInRangeConverter
,更加重要的是,它支持多个转换器进行组合,在开发工程中极大提高效率。
简单使用
勾选以阅读协议
则相应的提示消失

1 2 3 4 5 6 7 8 9 10 11
| <Window.Resources> <conv:BoolToVisibilityConverter x:Key="AgreementToVisiblityConvert" FalseValue="Hidden" IsInverted="True" /> </Window.Resources>
<TextBlock Foreground="Red" Text="需要勾选用户协议" Visibility="{Binding ElementName=cbxAgree, Path=IsChecked, Converter={StaticResource AgreementToVisiblityConvert}}" />
|
使用转换器组
转换组可以将多个转换器进行连接,生成自己想要的转换器,
输入用户名,则用户名不为空
提示消失。

转换器顺序为判断输入字符串是否为空
-bool取反
-将布尔转换为Visibility
1 2 3 4 5 6 7 8 9 10 11 12
| <Window.Resources> <conv:ValueConverterGroup x:Key="UserNameToVisibilityConverter"> <conv:StringIsNotNullOrEmptyConverter /> <conv:BoolInverter /> <conv:BoolToVisibilityConverter /> </conv:ValueConverterGroup> </Window.Resources>
<TextBlock Foreground="Red" Text="用户名不为空" Visibility="{Binding ElementName=txtName, Path=Text, Converter={StaticResource UserNameToVisibilityConverter}}" />
|
判断年龄是否在指定范围内

1 2 3 4 5 6 7 8 9 10 11 12 13
| <Window.Resources> <conv:ValueConverterGroup x:Key="AgeToVisibilityConverter"> <conv:StringToDecimalConverter /> <conv:IsInRangeConverter MaxValue="19" MinValue="18" /> <conv:BoolInverter /> <conv:BoolToVisibilityConverter /> </conv:ValueConverterGroup> </Window.Resources>
<TextBlock Foreground="Red" Text="年龄在18-19之间" Visibility="{Binding ElementName=txtAge, Path=Text, Converter={StaticResource AgeToVisibilityConverter}}" />
|
密码长度判断

1 2 3 4 5 6 7 8 9 10 11 12
| <Window.Resources> <conv:ValueConverterGroup x:Key="PasswordToVisibilityConverter"> <conv:IsInRangeConverter MaxValue="15" MinValue="8" /> <conv:BoolInverter /> <conv:BoolToVisibilityConverter /> </conv:ValueConverterGroup> </Window.Resources>
<TextBlock Foreground="Red" Text="密码长度不小于8" Visibility="{Binding ElementName=txtPassword, Path=Text.Length, Converter={StaticResource PasswordToVisibilityConverter}}" />
|
使用单例转换器
ValueConverters
包实现了单例模式,可以直接使用
<Button Content="OK" IsEnabled="{Binding ElementName=txtAge, Path=Text, Converter={x:Static conv:IsEmptyConverter.Instance}}" />
但是这样不能设置更具体的参数,只能使用提供的默认值,且有些实例不能直接使用。