WPF中Binding的数据转换—ValueConverters
在WPF中使用Binding经常会遇到需要转换的情况,如bool转为visibility,通常情况需要自己写一个类继承自IValueConverter
接口,使用详情请参见Binding对数据的转换和校验,这种方法虽然不难,但是在用XAML写界面时,需要大量的创建自定义转换器,这样代码就显得不够优雅,本文推荐一个Nuget包来解决这个问题。
首先安装Nuget包ValueConverters
,该包中已经涵盖了日常开发中常用的转换器,如BoolToVisibilityConverter
、StringIsNotNullOrEmptyConverter
、IsInRangeConverter
,更加重要的是,它支持多个转换器进行组合,在开发工程中极大提高效率。
简单使用
勾选以阅读协议
则相应的提示消失
<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
<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}}" />
判断年龄是否在指定范围内
<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}}" />
密码长度判断
<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}}" />
但是这样不能设置更具体的参数,只能使用提供的默认值,且有些实例不能直接使用。