• WPF中RadioButton绑定数据的正确方法


    RadioButton一般用于单选的时候,也就是从一组值中选择一个值。

    比如性别有“男”和“女”两种取值,而对于一个员工的实例来说,性别的取值要么是男,要么是女。

    这种时候一般就会用到RadioButton。

    RadioButton有一个IsChecked属性用于表示是否选中,IsChecked属性的值类型是bool,只能直接绑定bool类型的值。

    然而对于大多数时候来说,这种多选一的值我们一般会采用枚举等类型。比如性别我们会定义如下的枚举:

        public enum Sex
        {
            Male,
            Female
        }

    对于员工类,我们作如下定义:

        public class Employee : ModelBase
        {
            private string _name;
    
            public string Name
            {
                get
                {
                    return _name;
                }
                set
                {
                    _name = value;
                    RaisePropertyChanged(() => Name);
                }
            }
    
            private Sex _sex;
    
            public Sex Sex
            {
                get
                {
                    return _sex;
                }
                set
                {
                    _sex = value;
                    RaisePropertyChanged(() => Sex);
                }
            }
    
        }

    而要将员工的性别属性绑定到RaidoButton上,我们就需要使用到数据转换器。我们定义一个名为SexToBoolConverter的数据转换器来进行枚举类型Sex和bool类型之间的转换,如下所示:

        public class SexToBoolConverter : IValueConverter
        {
    
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                Sex s = (Sex)value;
                return s == (Sex)int.Parse(parameter.ToString());
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                bool isChecked = (bool)value;
                if (!isChecked)
                {
                    return null;
                }
                return (Sex)int.Parse(parameter.ToString());
            }

    转换器的Convert方法用于从Employee实例到RadioButton时的数据转换,而ConvertBack用于从RaidoButton到Employee实例时的数据转换。

    这里需要注意ConvertBack方法中判断value的值为false的时候,会直接返回null。

    这样写是为了RadioButton的状态变为未选中的时候,阻止数据传回Employee的实例。这一点非常重要,如果不这样做,值更新会在两个RadioButton之间形成一个环路,导致RadioButton不能正常工作。

    关于数据转换器的更多信息,大家可以到MSDN上查看,这里就不详细解释了。

    下面看看如何使用我们定义好的数据转换器,请看下面的xaml代码:

    xmlns:local="clr-namespace:WpfApplication1.Views"

    将上面这句代码添加到要使用转换器的xaml页面的命名空间引用,将其中的WpfApplication1.Views替换为你转换器所在的命名空间,当你的转换器位于另一个程序集的时候,你还需要使用assembly关键字来指定该程序集的名称。

    然后我们在页面资源中定义一个该转换器的静态资源,如下所示:

    <Window.Resources>
        <local:SexToBoolConverter x:Key="SexToBoolConverter"></local:SexToBoolConverter>
    </Window.Resources>

    如何在RadioButton上面使用呢?请看下面的代码:

    <RadioButton GroupName="Sex" IsChecked="{Binding Model.SelectedEmployee.Sex,Converter={StaticResource SexToBoolConverter},ConverterParameter=0}"></RadioButton>
    <RadioButton GroupName="Sex" IsChecked="{Binding Model.SelectedEmployee.Sex,Converter={StaticResource SexToBoolConverter},ConverterParameter=1}"></RadioButton>

    我们将当前选中员工的Sex属性绑定到RadioButton的IsChecked属性上,并指定绑定时需要使用SexToBoolConverter转换器,使用ConverterParameter来指定转换器使用的参数。

    示例代码:点击下载

  • 相关阅读:
    IIS配置ThinkPHP重写
    Redis安装
    ubuntu学习笔记
    PHP连接MySQL数据库SELinux中一些setsebool的用法
    centos+frp
    centos7.6安装nginx
    在CentOS 7-8上安装PHP 8.0
    centos7安装.net5.0(core)
    阿里云服务器配置清单
    阿里云服务器centos7.6安装mysql8.0.23
  • 原文地址:https://www.cnblogs.com/action98/p/3495494.html
Copyright © 2020-2023  润新知