zoukankan      html  css  js  c++  java
  • 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来指定转换器使用的参数。

    示例代码:点击下载

  • 相关阅读:
    P1280 尼克的任务
    P2286 [HNOI2004]宠物收养场
    筛法求素数
    拓扑排序
    观光旅游
    [USACO09OCT]热浪Heat Wave
    Java环境变量配置
    git 常用命令
    mysql-5.7安装、配置
    maven-java包管理工具-01
  • 原文地址:https://www.cnblogs.com/action98/p/3495494.html
Copyright © 2011-2022 走看看