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来指定转换器使用的参数。

 

示例代码:点击下载

posted on 2013-12-28 16:50  软件部  阅读(31632)  评论(8编辑  收藏  举报

导航