繁体   English   中英

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

[英]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 ),而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事件,则可以看到它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM