Winforms将Enum绑定到单选按钮
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Winforms将Enum绑定到单选按钮相关的知识,希望对你有一定的参考价值。
如果我有三个单选按钮,将它们绑定到具有相同选择的枚举的最佳方法是什么?例如
[] Choice 1
[] Choice 2
[] Choice 3
public enum MyChoices
{
Choice1,
Choice2,
Choice3
}
答案
我知道这是一个老问题,但它是第一个出现在我的搜索结果中的问题。我想出了一种将单选按钮绑定到枚举,甚至字符串或数字等的通用方法。
private void AddRadioCheckedBinding<T>(RadioButton radio, object dataSource, string dataMember, T trueValue)
{
var binding = new Binding(nameof(RadioButton.Checked), dataSource, dataMember, true, DataSourceUpdateMode.OnPropertyChanged);
binding.Parse += (s, a) => { if ((bool)a.Value) a.Value = trueValue; };
binding.Format += (s, a) => a.Value = ((T)a.Value).Equals(trueValue);
radio.DataBindings.Add(binding);
}
然后在表单的构造函数或表单加载事件上,在每个RadioButton
控件上调用它。 dataSource
是包含你的枚举属性的对象。我确保dataSource
实现了INotifyPropertyChanged
接口,在枚举属性setter中触发了OnPropertyChanged
事件。
AddRadioCheckedBinding(Choice1RadioButton, dataSource, "MyChoice", MyChoices.Choice1);
AddRadioCheckedBinding(Choice2RadioButton, dataSource, "MyChoice", MyChoices.Choice2);
另一答案
你能创建三个布尔属性:
private MyChoices myChoice;
public bool MyChoice_Choice1
{
get { return myChoice == MyChoices.Choice1; }
set { if (value) myChoice = MyChoices.Choice1; myChoiceChanged(); }
}
// and so on for the other two
private void myChoiceChanged()
{
OnPropertyChanged(new PropertyChangedEventArgs("MyChoice_Choice1"));
OnPropertyChanged(new PropertyChangedEventArgs("MyChoice_Choice2"));
OnPropertyChanged(new PropertyChangedEventArgs("MyChoice_Choice3"));
}
然后绑定到MyChoice_Choice1和其他人?
另一答案
我只是想加上我目前正在做的方式。这样没有“约束力”,但希望它能做同样的工作。
欢迎评论。
public enum MyChoices
{
Choice1,
Choice2,
Choice3
}
public partial class Form1 : Form
{
private Dictionary<int, RadioButton> radButtons;
private MyChoices choices;
public Form1()
{
this.InitializeComponent();
this.radButtons = new Dictionary<int, RadioButton>();
this.radButtons.Add(0, this.radioButton1);
this.radButtons.Add(1, this.radioButton2);
this.radButtons.Add(2, this.radioButton3);
foreach (var item in this.radButtons)
{
item.Value.CheckedChanged += new EventHandler(RadioButton_CheckedChanged);
}
}
private void RadioButton_CheckedChanged(object sender, EventArgs e)
{
RadioButton button = sender as RadioButton;
foreach (var item in this.radButtons)
{
if (item.Value == button)
{
this.choices = (MyChoices)item.Key;
}
}
}
public MyChoices Choices
{
get { return this.choices; }
set
{
this.choices = value;
this.SelectRadioButton(value);
this.OnPropertyChanged(new PropertyChangedEventArgs("Choices"));
}
}
private void SelectRadioButton(MyChoices choiceID)
{
RadioButton button;
this.radButtons.TryGetValue((int)choiceID, out button);
button.Checked = true;
}
}
以上是关于Winforms将Enum绑定到单选按钮的主要内容,如果未能解决你的问题,请参考以下文章
AngularJS:将布尔值绑定到单选按钮,以便在取消选中事件时将模型更新为 false