【问题标题】:Binding combobox to a propery of enum type does not fire set accessor将组合框绑定到枚举类型的属性不会触发 set 访问器
【发布时间】:2016-04-15 04:05:14
【问题描述】:

设置

我有以下课程:

public class MyClass
{
    private MyEnum _val;
    public MyEnum Val 
    {
         get { return _val; }
         set { _val = value; }
    }
}

以及以下枚举:

public enum MyEnum
{
  EnumValue1 = 0,
  ...
  EnumValue5 = 4
}

我还有一个 WinForms 组合框

期望的行为

我想用来自 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 访问器?

【问题讨论】:

  • 您在代码中的哪一点设置了 MyClass.Val 的值?

标签: c# .net winforms data-binding binding


【解决方案1】:

为了让它工作,你应该将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 事件,您可以看到它。

【讨论】:

  • 伊万,谢谢你精彩的解释。根据您的建议更改绑定解决了问题。
  • 一个小更新:绑定组合框后我必须执行以下操作:cb.SelectedIndex = (int)mc.Val,没有它组合框不会显示当前选择的值,尽管 Binding.BindingComplete没有任何错误,并且 get 访问器被正确调用。很奇怪。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
  • 2016-10-28
  • 2020-07-26
  • 2011-08-04
  • 2018-11-12
相关资源
最近更新 更多