将组合框绑定到枚举类型的 属性 不会触发设置访问器
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
),而 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 事件,就可以看到它。
设置
我有以下 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
),而 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 事件,就可以看到它。