zoukankan      html  css  js  c++  java
  • WPF中一个通用的BoolToXXX转换类

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

    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;

            }

        }

  • 相关阅读:
    我开发中的用到的几个框架
    关于ASP.NETCore的分享之学习路线
    首个.NET5+Vue.js业务模块化快速开发框架【NetModular】发布
    [C#] (原创)一步一步教你自定义控件 —— 系列文章
    EFS加密
    博客园样式美化:给博客添加一个音乐播放器
    XSS语义分析
    TCP回放攻击 & DDoS脉冲攻击Hit and Run IoT僵尸网络 在DDoS攻击黑产领域最活跃
    小样本学习,阿里做得比较早,但是效果未知——小样本有3类解决方法(算法维度):迁移学习、元学习(模型基础上学习模型)、度量学习(相似度衡量,也就是搜索思路),数据维度还有GAN
    真实世界中的开集识别问题(Open-Set Recognition Problem)——Walter J. Scheirer研究是最深的,安全里已经有研究了,但是感觉只是触及了皮毛而已
  • 原文地址:https://www.cnblogs.com/killmyday/p/1669941.html
Copyright © 2011-2022 走看看