将存储在对象中的枚举数据绑定到Winforms ComboBox中?

Joa*_*nge 5 .net c# data-binding winforms

谁知道怎么做?

我尝试了这个,但它只是填充了我已经做过的这个ComboBox.

我需要的是一种方法,只要我的对象上的枚举属性发生变化,就可以更新组合框:

DataObject.DataEnum
Run Code Online (Sandbox Code Playgroud)

但每当我更改组合框中的选定项目时,也会更新上面的枚举.

是否有可能做到这一点?

通常我习惯这样做绑定:

this.TextBox.DataBindings.Add ( "Text", this.DataObject, "Name", false, DataSourceUpdateMode.OnPropertyChanged );
Run Code Online (Sandbox Code Playgroud)

这很棒.

Jos*_*osh 4

您可以在 ComboBox 的 SelectedItem 属性上使用双向绑定。向组合框添加值时,请确保添加枚举值,而不仅仅是与其显示名称匹配的字符串。

comboBox.Items.Add(ConsoleColor.Red);
comboBox.Items.Add(ConsoleColor.Blue);
// ... etc
Run Code Online (Sandbox Code Playgroud)

现在 SelectedItem 可以作为枚举而不是字符串进行设置或获取。

编辑

听起来您的对象可能不会引发 Windows 窗体需要的属性更改通知来检测是否需要在 UI 中刷新对基础对象的更改。这是一篇关于如何做到这一点的文章。

编辑2

这是一个代码示例。我验证了这可以正常工作。

public partial class Form1 : Form {

    private Person p = new Person( );

    public Form1( ) {

        InitializeComponent( );

        comboBox1.DataSource = Enum.GetValues( typeof( Gender ) );

        textBox1.DataBindings.Add( "Text", p, "Name", false, DataSourceUpdateMode.OnPropertyChanged );
        comboBox1.DataBindings.Add( "SelectedItem", p, "Gender", false, DataSourceUpdateMode.OnPropertyChanged );

        label1.DataBindings.Add( "Text", p, "Name", false, DataSourceUpdateMode.Never );
        label2.DataBindings.Add( "Text", p, "Gender", false, DataSourceUpdateMode.Never );

    }
    private void Form1_Load( object sender, EventArgs e ) {
        // yeah, that's right i voted for him,
        // go ahead and downvote me
        p.Name = "John McCain";
        p.Gender = Gender.Male;
    }
    private void Form1_Click( object sender, EventArgs e ) {
        p.Name = "Sarah Palin";
        p.Gender = Gender.Female;
    }
}

public enum Gender {
    Male,
    Female
}

public class Person : INotifyPropertyChanged {

    private string name;
    private Gender gender;

    public string Name
    {
        get { return name; }
        set {
            name = value;
            PropertyChanged( this, new PropertyChangedEventArgs( "Name" ) );
        }
    }

    public Gender Gender {
        get { return gender; }
        set {
            gender = value;
            PropertyChanged( this, new PropertyChangedEventArgs( "Gender" ) );
        }
    }

    public event PropertyChangedEventHandler PropertyChanged = delegate {};

} 
Run Code Online (Sandbox Code Playgroud)