2009-10-01 92 views
1

我使用对象数据源将一个类绑定到窗体窗体:将简单属性绑定到文本框工作正常,但我需要将枚举属性绑定到组合框,例如:如何使用objectdatasource将枚举绑定到winform组合框

public enum MyEnum 
    { 
     Val1, 
     Val2, 
     Val3 
    } 
    private MyEnum enumVal; 

    public MyEnum EnumVal 
    { 
     get { return enumVal; } 
     set { enumVal = value; } 
    } 

如何使用绑定源完成此操作?我以各种方式尝试过,但这些都不起作用。 感谢

+0

我需要组合框保持与该类的EnumVal属性同步,即如果我更改EnumVal值,组合框将反映更改,反之亦然,如果我更改组合框值,EnumVal属性也会更新。 – 2009-10-01 09:02:17

回答

3

我不喜欢这样,但也许存在一个更好的办法:

List<ListItem<MyEnum>> enumVals = new List<ListItem<MyEnum>>(); 

foreach(MyEnum m in Enum.GetValues (typeof(MyEnum)) 
{ 
    enumVals.Add (new ListItem<MyEnum>(m, m.ToString()); 
} 

myComboBox.DataSource = enumVals; 
myComboBox.ValueMember = "Key"; 
myComboBox.DisplayMember = "Description"; 

注意ListItem<T>是包含一个关键属性和Description属性,我已经创建了一个自定义类。

为了保持你的属性与组合框的设定值的同步,则必须: - 一个数据绑定添加到组合框,使组合框的的SelectedValue绑定到你的财产 - 确保包含该属性的类实现INotifyPropertyChanged,以便在更改属性时,组合框的选定值也会更改。

myComboBox.DataBindings.Add ("SelectedValue", theBindingSource, "YourPropertyName"); 

public class TheClass : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private MyEnum _myField; 

    public MyEnum MyPropertyName 
    { 
     get { return _myField; } 
     set 
     { 
     if(_myField != value) 
     { 
      _myField = value; 
      if(PropertyChanged != null) 
        PropertyChanged ("MyPropertyName"); 
     } 
     } 
    } 
} 
+0

这将是好的...但如何使它自动与属性EnumVal同步?我正在使用ObjectDataSource和自动数据绑定。 – 2009-10-01 09:00:24

+0

完美,它的作品!谢谢! – 2009-10-01 10:33:22

1

我一直在寻找关于这个利基这个质量博客。在雅虎搜索驱使我在这里,我刚刚发现这种令人满意的读物,我一直在寻找。我在网上发现了这个答案,希望它能帮助你开箱即用。 这是很简单的...

定义枚举如:

public enum MyEnum{ 
    ItemOne, 
    ItemTwo, 
} 

在形式设置的组合框的数据源来的枚举例如值:

myCombo.DataSource = System.Enum.GetValues(typeof(MyEnum)); 

要使组合自动选择基于绑定对象的值,设置组合的数据绑定例如:

class MyObject{ 
    private MyEnum myEnumProperty; 
    public MyEnum MyEnumProperty{get {return myEnumProperty;}} 
} 
MyObject myObj = new MyObject(); 
myCombo.DataBindings.Add(new Binding("SelectedIndex", myObject, "MyEnumProperty");