一、说明

  很多时候,我们要把一个枚举的属性的绑定到一组RadioButton上。大家都知道是使用IValueConverter来做,但到底怎么做才好?

  而且多个RadioButton的Checked和UnChecked都会触发绑定,这样就会调多次的Set。

二、目的

  实现一个枚举属性绑定到多个RadioButton, 属性的Set方法不会被触发多次。

三、实现

  方法大家都知道,就是利用Converter和ConevertParamter属性。

  因为多个控件绑定一个属性,Checked和UnChecked之间属性可是会进行多次的Set的。

  这就得用到Binding.DoNothing 了,详细的说明:https://msdn.microsoft.com/zh-cn/library/system.windows.data.binding.donothing(v=vs.110).aspx

四、源码

  源码就很简单了。

using System;
using System.Globalization;
using System.Windows.Data; namespace BindingEnumToRadioButton
{
public class EnumToBooleanConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return value == null ? false : value.Equals(parameter);
} public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return value != null && value.Equals(true) ? parameter : Binding.DoNothing;
}
}
}

五、例子

using System.ComponentModel;
using System.Windows; namespace BindingEnumToRadioButton
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent(); DataContext = new SampleClass();
}
} public enum SampleEnum
{
One,
Two,
Three
} public class SampleClass : INotifyPropertyChanged
{
private SampleEnum _sampleEnum; public SampleEnum SampleEnum
{
get { return _sampleEnum; }
set
{
_sampleEnum = value;
HitCount++;
}
} //为了显示Set的触发次数
private int _hitCount;
public int HitCount
{
get { return _hitCount; }
set
{
_hitCount = value;
OnPropertyChanged("HitCount");
}
} public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string p_propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(p_propertyName));
}
}
}
}

在测试类中加入了HitCount属性,来显示Set的执行次数。每经过一次Set方法,都会加1.

Xaml:

<Window x:Class="BindingEnumToRadioButton.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:BindingEnumToRadioButton"
mc:Ignorable="d"
Title="MainWindow"
Height="350"
Width="525">
<Window.Resources>
<local:EnumToBooleanConverter x:Key="EnumToBooleanConverter" />
</Window.Resources>
<Grid>
<StackPanel>
<RadioButton Content="RadioButton One"
IsChecked="{Binding Path=SampleEnum,Converter={StaticResource EnumToBooleanConverter},ConverterParameter={x:Static local:SampleEnum.One}}" />
<RadioButton Content="RadioButton Two"
IsChecked="{Binding Path=SampleEnum,Converter={StaticResource EnumToBooleanConverter},ConverterParameter={x:Static local:SampleEnum.Two}}" />
<RadioButton Content="RadioButton Three"
IsChecked="{Binding Path=SampleEnum,Converter={StaticResource EnumToBooleanConverter},ConverterParameter={x:Static local:SampleEnum.Three}}" />
<StackPanel Orientation="Horizontal">
<TextBlock Text="Value: " />
<TextBlock Text="{Binding SampleEnum}" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Hit Count: " />
<TextBlock Text="{Binding HitCount}" />
</StackPanel>
</StackPanel>
</Grid>
</Window>

六、效果

目的达到了,枚举的属性值是正常的变化,Set方法的触发次数同样是正常的。

七、总结

这个东西很简单,但很实用,方法大家也都能想到,最多就是差到没想到用Binding.DoNothing了。

因为代码没有多少,就不上传源码了。

本文原创

转载请注明出处:http://www.cnblogs.com/gaoshang212/p/4973300.html

【WPF】如何把一个枚举属性绑定到多个RadioButton的更多相关文章

  1. WPF属性绑定实现双向变化

    WPF依赖项属性可以实现属性的绑定,成功绑定之后只要修改后台绑定的属性,即可UI同步自动更新绑定的值,无需手动刷新界面:同样,前台的值变化后,通过获取绑定的属性值也可获取UI变化后的值,实现双向变化的 ...

  2. WPF使用MVVM(一)-属性绑定

    WPF使用MVVM(一)-属性绑定 简单介绍MVVM MVVM是Model(数据类型),View(界面),ViewModel(数据与界面之间的桥梁)的缩写,是一种编程模式,优点一劳永逸,初步增加一些逻 ...

  3. C#中如何将combox中的下拉项和一个枚举中的各项进行绑定

    实现一个combobox,将其各个下拉项与枚举进行绑定 效果图如下: 代码详解如下: 枚举: public enum StoreSite { /// <summary> /// 未知 // ...

  4. 在 WPF 中获取一个依赖对象的所有依赖项属性

    原文:在 WPF 中获取一个依赖对象的所有依赖项属性 本文介绍如何在 WPF 中获取一个依赖对象的所有依赖项属性. 本文内容 通过 WPF 标记获取 通过设计器专用方法获取 通过 WPF 标记获取 p ...

  5. Object.assign()的用法 -- 用于将所有可枚举属性的值从一个或多个源对象复制到目标对象,返回目标对象

    语法: Object.assign(target, …sources) target: 目标对象,sources: 源对象用于将所有可枚举属性的值从一个或多个源对象复制到目标对象.它将返回目标对象. ...

  6. WPF 学习笔记-设置属性使窗口不可改变大小

    原文:WPF 学习笔记-设置属性使窗口不可改变大小 调整Windows下的ResizeMode属性: ResizeMode = NoResize Resize属性是控制Windows是否可以改变大小, ...

  7. WPF中的命令与命令绑定(二)

    原文:WPF中的命令与命令绑定(二) WPF中的命令与命令绑定(二)                                              周银辉在WPF中,命令(Commandi ...

  8. WPF中的命令与命令绑定(一)

    原文:WPF中的命令与命令绑定(一)   WPF中的命令与命令绑定(一)                                           周银辉说到用户输入,可能我们更多地会联想到 ...

  9. WPF学习(二) - 绑定

    绑定,这个看起来很神奇的东西,于我这种喜欢刨根儿的人而言,理解起来非常困难.    WPF绑定的核心思想是:数据层属性值的改变,能反应给展示层,反之亦然,并且这个响应的过程能被分离出来. 传统Winf ...

随机推荐

  1. 用POI读取具有任意合并单元的excel数据

    maven依赖: <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</ ...

  2. IE6的连接数限制问题

    今天解决了一个bug.看似是UI的bug,最后发现IE的设置问题(严格来说,IE6这么做没有问题,因为HTTP协议的规范如此). 先描述一下问题: 有一个页面管理Job,选中一些Job可以Run,每次 ...

  3. Reveal分析IOS界面,plist文件读取

    Reveal分析IOS界面,需要得到app的 softwareVersionBundleId上传到iphone中 , 而IOS8的iTunesMetadata.plist (设备路径/var/mobi ...

  4. 异步请求Ajax

    AJAX:Asynchronous JS And XML,包括HTML.CSS.JS.DOM.XML.JSON等,客户端技术范畴.主要目标:发起异步请求/响应,实现页面内容的局部刷新,提高浏览体验:实 ...

  5. OD使用教程

    OD使用教程: 跳转指令.满足才能跳转成功  

  6. 浅入了解GCD 并发 并行 同步 异步 多线程

     什么是 GCD?! GCD就是一个函数库(废话) 用来压榨系统的资源,解决多线程处理中一些问题的库(知道这个就够了,很多电影角色都是因为知道太多死得很惨!!!!!) 1.并发与并行 Concurre ...

  7. yii使用createCommand()增删改查

    查询单条数据$sql = "SELECT `name` FROM `table` WHERE id='7'";$users=Yii::$app->db->createC ...

  8. python 装饰器修改调整函数参数

    简单记录一下利用python装饰器来调整函数的方法.现在有个需求:参数line范围为1-16,要求把9-16的范围转化为1-8,即9对应1,10对应2,...,16对应8. 下面是例子: def fo ...

  9. MVC 单元测试

    1.新建mvc项目 添加controller 添加action 或者方法 public ActionResult Index(string str) { ViewBag.Teststr = str; ...

  10. VMware克隆虚拟机,克隆机网卡启动不了解决方案

    Shutting down loopback interface: [ OK ] Bringing up loopback interface: [ OK ] Bringing up interfac ...