【WPF】如何把一个枚举属性绑定到多个RadioButton

一、说明

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

时间: 2024-11-05 12:27:32

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

WPF中一个控件绑定另一个控件的属性

原文:WPF中一个控件绑定另一个控件的属性 如同一个Grid中的一个按钮根据另一个按钮的显示与否作出不同的响应: 绑定的时候通过ElementName来指定控件 <Grid Margin="50,130"> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition Width="40"/> </Grid.ColumnDefinitions>

WPF属性绑定实现双向变化

WPF依赖项属性可以实现属性的绑定,成功绑定之后只要修改后台绑定的属性,即可UI同步自动更新绑定的值,无需手动刷新界面:同样,前台的值变化后,通过获取绑定的属性值也可获取UI变化后的值,实现双向变化的效果.属性绑定使得UI更新非常的方便,下面分享一个小栗子说明使用的方式. 1.先做了一个有一个TextBlock和一个Button的UI,想要实现点击后TextBlock发生变化. <Window x:Class="WPFDemo.Window1" xmlns="http:

wpf中如何在xaml中绑定cs中类的属性

cs代码:/// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); ContentGrid.DataContext = this; this.Path = "数据绑定"; } public string Path { get; set;

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

实现一个combobox,将其各个下拉项与枚举进行绑定 效果图如下: 代码详解如下: 枚举: public enum StoreSite { /// <summary> /// 未知 /// </summary> [EnumTitle("未知")] None = 0, /// <summary> /// 北京 /// </summary> [EnumTitle("北京")] Beijing = 1, /// <s

8 WPF学习之深入浅出话属性

转载:http://blog.csdn.net/fwj380891124/article/details/8131080 通过前面的学习,我们已经知道Data Binding是WPF"数据驱动UI"理念的基础.上一章我们将主要的精力放在了Binding的数据源这一端,研究了Binding的Source和Path.本章我们将把目光移向Binding的目标端,研究一下什么样的对象才能作为Binding的Target以及Binding将把数据送往何处. 1.1      属性(Propert

WPF 动态列(DataGridTemplateColumn) 绑定数据 (自定义控件)

原文:WPF 动态列(DataGridTemplateColumn) 绑定数据 (自定义控件) 因为项目需要 要实现这个~ 怎么实现画红框内容部分 田字格和上面Textbox 属于一个自定义控件  大致功能是获得一个字符串 和一组颜色值 最后田字格会显示不同颜色 这篇主要讲 DataGridTemplateColumn 并实现重写Datatemplate 重点注释 单独列出来了 LS 是列数据对象集合 listName是行数据对象集合 var Item = new FrameworkElemen

WPF 动态列(DataGridTemplateColumn) 绑定数据 (自定义控件)对象绑定

原文:WPF 动态列(DataGridTemplateColumn) 绑定数据 (自定义控件)对象绑定 WPF 动态列(DataGridTemplateColumn) 绑定数据 (自定义控件) 上面的使用动态对象加载的数据 发现一个问题 一个是卡 二是 对象数量得写死 很不开心 最后使用对象方式 也应该使用对象方式 因为业务需要 我的datagird 数据来源于俩个对象 列头是一个,行和行内容是一个  不好的点是列行的数据匹配 不好掌控 因为业务问题 数据库设计问题 后期再修改成一个对象吧 行对

2019-11-29-WPF-依赖属性绑定不上调试方法

原文:2019-11-29-WPF-依赖属性绑定不上调试方法 title author date CreateTime categories WPF 依赖属性绑定不上调试方法 lindexi 2019-11-29 08:46:33 +0800 2019-8-2 18:44:5 +0800 WPF 在写 WPF 程序的时候会遇到依赖属性绑定了,但是值没有更新或者没有绑定上的问题,本文告诉大家可以如何调试 依赖属性不对应 在写依赖属性的时候,默认使用快捷键创建,但是如果是自己写的,需要注意引用的类以

wpf中UserControl的几种绑定方式

原文:wpf中UserControl的几种绑定方式 我们经常会抽取一些可重用的控件,某个属性是否需要重用,直接决定了这个属性的绑定方式. 1.完全不可重用的控件 有一些与业务强相关的控件,它们的属性完全来自ViewModel,越是相对复杂的控件,越容易这样.比如: // ChooseUc.xaml <UserControl> <StackPanel Orientation="Horizontal"> <Label Content="选择一个水果: