我正在尝试进行(非常)简单的数据绑定测试,但它不能像我预期的那样工作...说我有以下类:
// this class represents some kind of data producer
public class DataSourceClass
{
public string Data { get; set; }
public DataSourceClass()
{ }
}
//this form holds the TextBox control as the Data consumer
public partial class DatabindingTestForm : Form
{
public DataSourceClass ds { get; set; }
public DatabindingTestForm()
{
InitializeComponent();
ds = new DataSourceClass();
textBox.DataBindings.Add("Text", ds, "Data");
}
private void checkBox_CheckedChanged(object sender, EventArgs e)
{
if (checkBox.Checked)
ds.Data = "CHECKED";
else
ds.Data = "NOT CHECKED";
}
}
我没有添加设计器代码,但它在那里,表单包含TextBox对象和CheckBox对象。您可以理解,我正在尝试更改Textbox Text属性,因为用户检查\取消选中CheckBox。 但是此代码不会更新TextBox Text属性。有人可以解释一下我错过了什么吗?
答案 0 :(得分:7)
当Data
属性的值发生更改时,您需要一些方法来通知WinForms。最直接的方法是:
DataSourceClass
:public event EventHandler DataChanged;
DataSourceClass
实施INotifyPropertyChanged
。这会为您提供PropertyChanged
事件。无论哪种方式,你都会有一个需要加注的新事件。您需要将Data
属性从自动属性转换为具有私有字段,get
方法和set
方法的属性。一旦你有Data
属性的显式getter和setter,你就可以从setter中提升你的事件。
答案 1 :(得分:4)
您可以使用INotifyPropertyChanged
界面。我没有通过IDE /编译器运行它,因此可能存在语法错误。
public class DataSourceClass : INotifyPropertyChanged
{
private string _data;
public string Data
{
get
{
return _data;
}
set
{
if( _data != value )
{
_data = value;
OnPropertyChanged( "data" );
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged( string propertyName )
{
PropertyChangedEventHandler handler = PropertyChanged;
if( handler != null )
{
handler( new PropertyChangedEventArgs( propertyName ) );
}
}
}