将组合框绑定到枚举类型的 属性 不会触发设置访问器

Binding combobox to a propery of enum type does not fire set accessor

设置

我有以下 class:

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 属性 并让组合框更新此 属性 每当我更改选择时组合框。

问题

由于某些原因,当我更改组合框的值时,组合框没有调用我的 属性 的设置访问器,但是调用了 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 to true and bind to SelectedValue 属性

cb.DataBindings.Add("SelectedValue", mc, true, DataSourceUpdateMode.OnPropertyChanged);

SelectedValue 是合乎逻辑的选择,因为它与目标 属性 的类型相同(在本例中为 MyEnum),而 SelectedIndexint类型并需要转换。

如果您对为什么绑定到 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 事件,就可以看到它。