【问题标题】:Data binding an Enum stored in an object into a Winforms ComboBox?将存储在对象中的枚举数据绑定到 Winforms ComboBox?
【发布时间】:2011-01-01 21:04:37
【问题描述】:

有人知道怎么做吗?

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

我需要的是一种在我的对象上的枚举属性发生变化时更新组合框的方法:

DataObject.DataEnum

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

可以这样做吗?

通常我习惯这样绑定:

this.TextBox.DataBindings.Add ( "Text", this.DataObject, "Name", false, DataSourceUpdateMode.OnPropertyChanged );

效果很好。

【问题讨论】:

  • 哪一个?我尝试了这篇文章,但是当我更新 DataObject.DataEnum 时它没有解决问题,ComboBox 没有更新。如果我也必须手动执行此操作,那么数据绑定有什么好处。我可以自己动手完成。
  • 您可能没有提出属性更改通知吗? Windows 窗体将使用 INotifyPropertyChanged 或 DataEnumChanged 事件来检测对基础对象的更改。您需要执行其中一项操作才能让 Windows 窗体绑定知道发生了更改。
  • 我将 INotifyPropertyChanged 用于我的 DataEnum。

标签: c# .net winforms data-binding


【解决方案1】:

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

comboBox.Items.Add(ConsoleColor.Red);
comboBox.Items.Add(ConsoleColor.Blue);
// ... etc

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

编辑

听起来您的对象可能没有引发属性更改通知,Windows 窗体需要这些通知来检测对基础对象的更改需要在 UI 中刷新。 Here is an article 关于如何做到这一点。

编辑 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 {};

} 

【讨论】:

  • 所以我可以使用 ColourList.DataSource = Enum.GetValues(typeof(Colour));填充组合框?
  • 我已经有一段时间没有使用 Windows 窗体了,但是我认为应该可以正常工作。
  • 谢谢,我会尽力让你知道的。
  • 我收到错误消息:“无法在具有空 ValueMember 的 ListControl 中设置 SelectedValue”。你知道为什么会这样吗?我正确填充组合框。
  • 功能更强大。它在 WPF 中得到了非常广泛的支持。
猜你喜欢
  • 2011-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
  • 1970-01-01
  • 2016-12-12
  • 1970-01-01
相关资源
最近更新 更多