[英]Binding combobox to a propery of enum type does not fire set accessor
我有以下课程:
public class MyClass
{
private MyEnum _val;
public MyEnum Val
{
get { return _val; }
set { _val = value; }
}
}
和以下枚举:
public enum MyEnum
{
EnumValue1 = 0,
...
EnumValue5 = 4
}
我也有一个WinForms ComboBox
我想用来自MyEnum的值填充组合框,并将组合框的选定索引绑定到MyClass.Val属性,并在我更改组合框的选择时让组合框更新此属性。
出于某种原因,当我更改组合框的值时,组合框不会调用我的属性的set访问器,但是get访问器的调用没有任何问题或异常
我的绑定如下:
MyClass mc = new MyClass();
ComboBox cb = c //I get the c value by iterating through my WebForms Form's Controls collection
cb.DataSource = Enum.GetValues(typeof(MyEnum)); //This populates the values of the combobox and works OK
cb.DataBindings.Add("SelectedIndex", mc, "Val", false, DataSourceUpdateMode.OnPropertyChanged); //This seems to partially work: only the get accessor is called, the set accessor is never called
我已经阅读了许多其他类似的线程,但是它们无关紧要(建议使用DataSourceUpdateMode.OnPropertyChanged或与WPF相关)或无济于事(建议在绑定之前将枚举转换为List)。
我是否缺少某些东西或做错了什么? 谁能建议如何使组合框调用set访问器?
为了使其工作,您应该将Binding.FormattingEnabled设置为true
并像这样绑定到SelectedValue属性。
cb.DataBindings.Add("SelectedValue", mc, true, DataSourceUpdateMode.OnPropertyChanged);
SelectedValue
是一个逻辑选择,因为它与目标属性的类型相同(在本例中为MyEnum
),而SelectedIndex
是int
类型,需要转换。
如果您有兴趣为什么绑定到SelectedIndex
只能在一个方向上起作用而不能在另一个方向上起作用,则在这里进行解释:
// Updating control from data source
var v1 = Convert.ChangeType(MyEnum.EnumValue1, typeof(int)); // Ok, v1 = 0
// Updating data source from control
var v2 = Convert.ChangeType(0, typeof(MyEnum)); // InvalidCastException
数据绑定基础结构对您隐藏了异常。 如果将处理程序附加到Binding.BindingComplete事件,则可以看到它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.