WPF中Binding的数据转换—ValueConverters

WPF中Binding的数据转换—ValueConverters

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

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

简单使用

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

WPF中Binding的数据转换—ValueConverters_第1张图片

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

使用转换器组

转换组可以将多个转换器进行连接,生成自己想要的转换器,

输入用户名,则用户名不为空提示消失。

WPF中Binding的数据转换—ValueConverters_第2张图片

转换器顺序为判断输入字符串是否为空-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}}" />

判断年龄是否在指定范围内

WPF中Binding的数据转换—ValueConverters_第3张图片

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

密码长度判断

WPF中Binding的数据转换—ValueConverters_第4张图片

<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包实现了单例模式,可以直接使用

你可能感兴趣的:(WPF,wpf,c#,xaml,ui)