WPF中一个通用的BoolToXXX转换类

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF中一个通用的BoolToXXX转换类相关的知识,希望对你有一定的参考价值。

在WPF程序的数据绑定里面,经常会通过一个布尔类型的值来控制UI控件的状态,例如是否可见,是否最大化之类的。然而UI控件的各个状态属性的类型往往不是布尔类型,比如UIElement.Visibility的类型是Visibility枚举,Window.WindowState的类型是WindowState枚举。以前我为了将布尔类型的数据绑定到这些可依赖属性的时候,经常要写很多ValueConverter,例如BoolToVisibilityConverter啦,BoolToWindowStateConverter啦,很麻烦。介绍一个通用的BoolToXXX转换类,这个类使用Binding对象的ConverterParameter和FallbackValue来实现布尔类型与任意值转换的功能。

ConverterParameter是数据绑定的时候UI传到ValueConverter的参数,比如要将一个字符串通过数据绑定转换成整数,可以通过ConverterParameter来指定按照十进制还是十六进制转换。而FallbackValue的作用是,当数据绑定不能提供一个有意义的数值的时候(通过返回DependencyProperty.UnsetValue这个值),数据绑定引擎就会使用FallbackValue里面指定的值。

先看看BoolToValueConverter的源代码:

 public class BoolToValueConverter : IValueConverter


    {


        #region IValueConverter Members


 


        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)


        {


            if ((bool)value)


                return parameter;


            else


                return DependencyProperty.UnsetValue;


        }


 


        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)


        {


            return object.Equals(value, parameter);


        }


 


        #endregion


    }

上面的Convert函数,通过判断绑定的布尔值,如果为真(True),则使用Binding对象的ConverterParameter属性保存的值,如果为假(False),那么返回DependencyProperty.UnsetValue,这样就告诉数据绑定引擎,使用Binding对象的FallbackValue。而ConvertBack的作用就是为了判断 UI对象对应属性的值(例如UIElement.Visibility)是不是和预设的值(例如Visibility.Visible)相同,而返回相应的值。你也可以通过下面的代码来获知BoolToValueConverter的用法—请注意黄色加亮的部分:

BoolToValueTestWindow.xaml:


<Window x:Class="ManualTestProject.WpfLibTest.BoolToValueTestWindow"


    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"


    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"


    xmlns:converter="clr-namespace:WpfLib.Converters;assembly=WpfLib"


    Title="BoolToValueTestWindow" Height="300" Width="300" x:Name="LayoutRoot">


    <Window.Resources>


        <converter:BoolToValueConverter x:Key="BoolToValueConverter" />


    </Window.Resources>


    <StackPanel>


        <CheckBox IsChecked="{Binding ElementName=LayoutRoot, Path=BoolValue}"


                  Content="Check box" />


        <Button Content="True"


                Visibility="{Binding ElementName=LayoutRoot, Path=BoolValue, Converter={StaticResource BoolToValueConverter}, ConverterParameter=Visible, FallbackValue=Collapsed}"


                x:Name="TrueButton" Click="TrueButton_Click"/>


        <Button Content="False"


                Visibility="{Binding ElementName=LayoutRoot, Path=BoolValue, Converter={StaticResource BoolToValueConverter}, ConverterParameter=Collapsed, FallbackValue=Visible}"


                x:Name="FalseButton" Click="FalseButton_Click"/>


    </StackPanel>


</Window>


 


BoolToValueTestWindow.xaml.cs:


    public partial class BoolToValueTestWindow : Window


    {


        public bool BoolValue


        {


            get { return (bool)GetValue(BoolValueProperty); }


            set { SetValue(BoolValueProperty, value); }


        }


 


        public static readonly DependencyProperty BoolValueProperty =


            DependencyProperty.Register("BoolValue",


                     typeof(bool),


                     typeof(BoolToValueTestWindow),


                     new UIPropertyMetadata(false));


 


        public BoolToValueTestWindow()


        {


            InitializeComponent();


        }


 


        private void TrueButton_Click(object sender, RoutedEventArgs e)


        {


            BoolValue = false;


        }


 


        private void FalseButton_Click(object sender, RoutedEventArgs e)


        {


            BoolValue = true;


        }


    }

以上是关于WPF中一个通用的BoolToXXX转换类的主要内容,如果未能解决你的问题,请参考以下文章

WPF报表自定义通用可筛选列头-WPF特工队内部资料

WPF报表自定义通用可筛选列头-WPF特工队内部资料

WPF中Grid实现网格,表格样式通用类(转)

简单的通用TreeView(WPF)

dotnet 读 WPF 源代码笔记 为什么加上 BooleanBoxes 类

WPF实用小工具