简单的DataBinding

时间:2010-08-11 17:55:39

标签: c# winforms data-binding

我正在尝试进行(非常)简单的数据绑定测试,但它不能像我预期的那样工作...说我有以下类:

// 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属性。有人可以解释一下我错过了什么吗?

2 个答案:

答案 0 :(得分:7)

Data属性的值发生更改时,您需要一些方法来通知WinForms。最直接的方法是:

  • 将活动添加到DataSourceClasspublic 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 ) );
        }
    }
}