一、说明

  很多时候,我们要把一个枚举的属性的绑定到一组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. 面试题<初级>

    INTERVIEW .markdown-body ul pre code { background:red; font-size:40px; } @code-char:"```" ...

  2. python splinter

    from splinter.browser import Browser with Browser() as b: for url,name in web: b.visit(url) b.fill(' ...

  3. linux备忘

    一.数字计算 echo $[3600*24] --只能计算整数echo $((3600*4)) --只能计算整数 expr 3600 \* 24        --注意空格,*要加\,只能计算整数ec ...

  4. 关于PHP学习的各种网站

    http://www.shouce.ren/ 各种开发手册 http://yii2.techbrood.com/guide-upgrade-from-v1.html yii2.0和之前版本的区别htt ...

  5. 史上最强防火墙iptables

    #1.清空所有的防火墙规则 iptables -F iptables -X iptables -Z iptables -t NAT -F iptables -t NAT -X iptables -t ...

  6. c#一个泛型控制Textbox 和label 控件 泛型方法。

    class ControlHelper { public static void ShowOnTxtLbl<T>(T control, string mess) where T : Sys ...

  7. UITableViewCell的highlighted 和selected 属性1

    将UITableViewCell的selectedBackgroundView设置为按下图片的状态,同时不支持多选的情况下,遇到如下问题: 如果默认第一个cell处于selected状态,然后再点击其 ...

  8. JAVA求解线性方程组-列主元高斯消去法

    package MyMath; import java.util.Scanner; public class Gauss { /** * @列主元高斯消去法 */ static double x[]; ...

  9. datagridview 定位到最后一行,定位不准的原因

    C# 写的 winform 程序,定位到最后一行 dgvGoods.FirstDisplayedScrollingRowIndex = dgvGoods.Rows.Count - 1; 测试中发现,一 ...

  10. js常用的地址栏参数获取

    用JS获取地址栏参数的方法(超级简单) 方法一:采用正则表达式获取地址栏参数:( 强烈推荐,既实用又方便!) function GetQueryString(name) {      var reg ...