Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 简单数据绑定_C#_Winforms_Data Binding - Fatal编程技术网

C# 简单数据绑定

C# 简单数据绑定,c#,winforms,data-binding,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 t

我正在尝试做一个(非常)简单的数据绑定测试,但它并没有像我预期的那样工作。。。假设我有以下课程:

// 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文本属性。
但此代码不会更新TextBox文本属性。有人能解释一下我遗漏了什么吗?

数据属性的值更改时,您需要某种方式通知WinForms。最直接的方法是:

  • 将事件添加到
    DataSourceClass
    public event EventHandler DataChanged
  • 使
    DataSourceClass
    实现
    INotifyPropertyChanged
    。这将为您提供一个
    PropertyChanged
    事件

无论哪种方式,你都会有一个新的活动需要举办。您需要将
数据
属性从自动属性转换为具有专用字段、
get
方法和
set
方法的属性。一旦有了
数据的显式getter和setter
属性,就可以从setter内部引发事件。

您可以使用
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 ) );
        }
    }
} 

我有一个填充,我错过了主要的想法。。。如果仍然需要添加事件,为什么需要使用数据绑定?我可以使用事件(无需ControlBindingsCollection…)作为一个如此简单的示例,您可以使用一个事件直接更新文本框。但是,在实际的应用程序中,您希望将数据模型(您的
DataSourceClass
)与用户界面(文本框)分开。数据绑定的目的是坐在模型和UI之间,在它们之间传递数据,而不需要让它们相互了解。