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

摘要:
RadioButton一般用于单选的时候,也就是从一组值中选择一个值。这种时候一般就会用到RadioButton。RadioButton有一个IsChecked属性用于表示是否选中,IsChecked属性的值类型是bool,只能直接绑定bool类型的值。isChecked){returnnull;}returnint.Parse;}转换器的Convert方法用于从Employee实例到RadioButton时的数据转换,而ConvertBack用于从RaidoButton到Employee实例时的数据转换。这样写是为了RadioButton的状态变为未选中的时候,阻止数据传回Employee的实例。这一点非常重要,如果不这样做,值更新会在两个RadioButton之间形成一个环路,导致RadioButton不能正常工作。

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

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

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

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

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

    public enumSex
    {
        Male,
        Female
    }

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

    public classEmployee : ModelBase
    {
        private string_name;

        public stringName
        {
            get{
                return_name;
            }
            set{
                _name =value;
                RaisePropertyChanged(() =>Name);
            }
        }

        privateSex _sex;

        publicSex Sex
        {
            get{
                return_sex;
            }
            set{
                _sex =value;
                RaisePropertyChanged(() =>Sex);
            }
        }

    }

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

    public classSexToBoolConverter : IValueConverter
    {

        public object Convert(object value, Type targetType, objectparameter, System.Globalization.CultureInfo culture)
        {
            Sex s =(Sex)value;
            return s == (Sex)int.Parse(parameter.ToString());
        }

        public object ConvertBack(object value, Type targetType, objectparameter, 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来指定转换器使用的参数。

示例代码:点击下载

免责声明:文章转载自《WPF中RadioButton绑定数据的正确方法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇PHP框架开发——路由器功能【c#搬砖记】用Docx导出word格式的docx文件下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

周末充电之WPF(四).多窗口之间操作

多窗口实例: 1.在多个窗口的情况下如何自定义指定要启动的窗口程序 1 <Application x:Class="toolbar.App" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x...

WPF外包公司—北京动点飞扬软件:WPF技术分享—Prism V2之旅(1)

概述     如果你在开发wpf程序,应该听说过The Composite Application Guidance for WPF(以下简称prism)     总而言之,prism是帮助你开发复杂的wpf应用程序的。希望在看完此系列教程以后能对你有所帮助.     从去年正式版发布至今,将近快半年了.silverlight 2正版的推出.prism也开...

WPF知识点全攻略10- 路由事件

路由事件是WPF不得不提,不得不会系列又一  先来看一下他的定义: 功能定义:路由事件是一种可以针对元素树中的多个侦听器(而不是仅针对引发该事件的对象)调用处理程序的事件。 实现定义:路由事件是一个 CLR 事件,可以由 RoutedEvent 类的实例提供支持并由 Windows Presentation Foundation (WPF) 事件系统来处理...

DevExpress WPF让创建绑定到数据的3D图表控件变得更容易(Part 1)

下载DevExpress v20.1完整版 富文本控件难上手?这堂公开课你一定不能错过,不同视图不同应用场景全解! 通过DevExpress WPF Controls,您能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 在本教程中,您将完成可视化数据源所需的步骤。 应该执行以下步骤,本文我们将...

WPF 客户端浏览器 添加Loading加载进度

在windows开发界面时,使用浏览器来请求和显示网页内容,是比较常见的。 但是在请求网页内容时,因网速或者前端功能复杂加载较慢,亦或者加载时遇到各种问题,如空白/黑屏/加载不完整/证书问题等。 因此需要一个加载进度/加载失败的显示界面。 加载进度显示 界面显示 1. 界面显示,加载进度样式可参考: 绕圈进度条 2. 添加Loading状态枚举。不加载/加...

WPF中MVVM模式下的按钮事件实现和依赖项通知

自从上一次写MVVM入门到现在,又过了好长时间了,一直想着把事件的绑定总结一下,但是一来是认识的不够,感觉讲不清楚;二来是懒。不管了,写的不对的地方大家提一下,错误要是不暴露它就一直是错误。先说按钮的事件绑定,.net中提供的ICommand就是这么用的,自己写一个command的基类,继承ICommand,实现ICommand的3个方法,最简单的实现:...