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

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

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

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

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

  1. public enum Sex
  2. {
  3. Male,
  4. Female
  5. }

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

  1. public class Employee : ModelBase
  2. {
  3. private string _name;
  4.  
  5. public string Name
  6. {
  7. get
  8. {
  9. return _name;
  10. }
  11. set
  12. {
  13. _name = value;
  14. RaisePropertyChanged(() => Name);
  15. }
  16. }
  17.  
  18. private Sex _sex;
  19.  
  20. public Sex Sex
  21. {
  22. get
  23. {
  24. return _sex;
  25. }
  26. set
  27. {
  28. _sex = value;
  29. RaisePropertyChanged(() => Sex);
  30. }
  31. }
  32.  
  33. }

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

  1. public class SexToBoolConverter : IValueConverter
  2. {
  3.  
  4. public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  5. {
  6. Sex s = (Sex)value;
  7. return s == (Sex)int.Parse(parameter.ToString());
  8. }
  9.  
  10. public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  11. {
  12. bool isChecked = (bool)value;
  13. if (!isChecked)
  14. {
  15. return null;
  16. }
  17. return (Sex)int.Parse(parameter.ToString());
  18. }

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

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

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

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

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

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

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

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

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

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

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

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

示例代码:点击下载

WPF中RadioButton绑定数据的正确方法的更多相关文章

  1. Python的list循环遍历中,删除数据的正确方法

    在遍历list,删除符合条件的数据时,总是报异常,代码如下: num_list = [1, 2, 3, 4, 5] print(num_list) for i in range(len(num_lis ...

  2. Web 性能优化: 使用 Webpack 分离数据的正确方法

    摘要: Webpack骚操作. 原文:Web 性能优化: 使用 Webpack 分离数据的正确方法 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 制定向用户提供文件的最佳方式可能是一 ...

  3. C#中遍历各类数据集合的方法总结

    C#中遍历各类数据集合的方法总结: 1.枚举类型 //遍历枚举类型Sample的各个枚举名称 foreach (string sp in Enum.GetNames(typeof(Sample))) ...

  4. 【.NET】C#中遍历各类数据集合的方法

    [.NET]C#中遍历各类数据集合的方法   C#中遍历各类数据集合的方法,这里自己做下总结: 1.枚举类型             //遍历枚举类型Sample的各个枚举名称             ...

  5. WPF中Binding使用StringFormat格式化字符串方法

    原文:WPF中Binding使用StringFormat格式化字符串方法 货币格式 <TextBlock Text="{Binding Price, StringFormat={}{0 ...

  6. 封装:WPF中可以绑定的BindPassWord控件

    原文:封装:WPF中可以绑定的BindPassWord控件 一.目的:本身自带的PassWord不支持绑定 二.Xaml部分 <UserControl x:Class="HeBianG ...

  7. JMeter 中对于Json数据的处理方法

    JMeter中对于Json数据的处理方法 http://eclipsesource.com/blogs/2014/06/12/parsing-json-responses-with-jmeter/ J ...

  8. JMeter中返回Json数据的处理方法

    Json 作为一种数据交换格式在网络开发,特别是 Ajax 与 Restful 架构中应用的越来越广泛.而 Apache 的 JMeter 也是较受欢迎的压力测试工具之一,但是它本身没有提供对于 Js ...

  9. 【jmeter】JMeter中返回Json数据的处理方法

    Json 作为一种数据交换格式在网络开发,特别是 Ajax 与 Restful 架构中应用的越来越广泛.而 Apache 的 JMeter 也是较受欢迎的压力测试工具之一,但是它本身没有提供对于 Js ...

随机推荐

  1. HTML5 获取地理位置信息

    HTML5增加的新功能,获取地理位置信息,如果浏览器支持且设备有定位功能,就能够直接使用这组API来获取当前信息位置.该Geolocation API可以应用于移动设备中的地理位置. Geolocat ...

  2. arcgis server10.2.2之地理编码服务发布

    1.地理编码工具(Geocoding Tools)locator制作     打开arcCatalog,找到工具箱ArcToolbox中的Geocoding Tools---Create Addres ...

  3. SharePoint 2013 图文开发系列之创建内容类型

    SharePoint内容类型,是很有特色的,就好比发布新闻,同在一张列表里,可以由内容类型区分图片新闻.文字新闻等,顾名思义,就是在一张列表里发布不同类型的项目. 1.添加新项目,选择SharePoi ...

  4. iOS之获取屏幕尺寸

    //app尺寸,去掉状态栏 CGRect appRect = [UIScreenmainScreen].applicationFrame; NSLog(@"%f, %f, %f,%f&quo ...

  5. iOS之自动调节输入文本框的高度

    //自动调节输入文本框的高度 - (void)textViewDidChange:(UITableView *)textView{ float height; if ([[[UIDevice curr ...

  6. ViewStub源码分析

    ViewStub是一种特殊的View,Android官方给出的解释是:一种不可见的(GONE).size是0的占位view,多用于运行时 延迟加载的,也就是说真正需要某个view的时候.在实际项目中, ...

  7. 【Linux学习】Vi 操作命令集合

    Vi 操作命令集合 进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi +n filename :打开文件,并将光标置于第n行首 vi + filename :打开文 ...

  8. CentOS安装LNMP环境的基础组件

    注:以下所有操作均在CentOS 6.5 x86_64位系统下完成. 在安装LNMP环境之前,请确保已经使用yum安装了以下各类基础组件(如果系统已自带,还可以考虑yum update下基础组件): ...

  9. 编译软件基础知识(1/2) via LinuxSir

    内容来自LinuxSir: 如果不出意外的话,会出现say.so => not found. 这时的./test是不能运行的.但至少说明程序运行时是需要这个库的.那为什么找不到这个库呢?那就让我 ...

  10. spark streaming kafka example

    // scalastyle:off println package org.apache.spark.examples.streaming import kafka.serializer.String ...