WPF中Binding的数据转换—ValueConverters

WPF中Binding的数据转换—ValueConverters

WPF中Binding的数据转换—ValueConverters

在WPF中使用Binding经常会遇到需要转换的情况,如bool转为visibility,通常情况需要自己写一个类继承自IValueConverter接口,使用详情请参见Binding对数据的转换和校验,这种方法虽然不难,但是在用XAML写界面时,需要大量的创建自定义转换器,这样代码就显得不够优雅,本文推荐一个Nuget包来解决这个问题。

首先安装Nuget包ValueConverters,该包中已经涵盖了日常开发中常用的转换器,如BoolToVisibilityConverterStringIsNotNullOrEmptyConverterIsInRangeConverter,更加重要的是,它支持多个转换器进行组合,在开发工程中极大提高效率。

简单使用

勾选以阅读协议则相应的提示消失

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}}" />

但是这样不能设置更具体的参数,只能使用提供的默认值,且有些实例不能直接使用。

作者

步步为营

发布于

2024-05-08

更新于

2025-03-15

许可协议