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)
这很棒.
您可以在 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)