目录
引言
绑定的方式
双向绑定
验证时更改数据源
立即更改数据源
单向绑定
绑定方法
属性界面选择绑定
通过代码手动绑定
绑定自定义数据类型
引言
DataBindings 的出现显然是为了解决后台数据与前端界面的同步问题,通过绑定控件属性与对象属性,解决二者的同步问题。下图演示的是双向绑定的情景:
借助这种便利,还可自动完成数值与文本之间的自动转换。
绑定的方式
双向绑定
验证时更改数据源
数据源更新模式:OnValidation
引言所演示的就是验证时更新数据源,在textbox控件失去焦点时,触发Onvalidation事件,继而更改TrackBar控件value属性。默认模式
立即更改数据源
数据源更新模式:OnPropertyChanged
在我修改textbox控件值时,会立即修改TrackBar控件value值
单向绑定
数据源更新模式:Never
修改Textbox值时,TrackBar控件value属性不会更改。
绑定方法
属性界面选择绑定
可绑定的属性会列在DataBindings列表下面,选择Text后,首先先添加项目数据源。我们绑定的是类对象,这里选择对象数据。
接着选择数据对象,从自定义类库或系统类库中选择程序集,这里我们绑定的系统程序集,把隐藏系统程序集取消勾选,选择TrackBar控件。
我已经添加过绑定了,所以最后会出现两个Source,选择其中一个即可。设计器下方会自动添加一个BindingSource控件。到此已完成实例控件属性到类属性的绑定,我们还需要给这个绑定对象赋实例对象。我们在代码中给其赋值即可实现二个对象的绑定。
通过代码手动绑定
我们看一下设计器自动生成代码
this.components = new System.ComponentModel.Container();
this.label1 = new System.Windows.Forms.Label();
this.trackBar1 = new System.Windows.Forms.TrackBar();
this.textBox1 = new System.Windows.Forms.TextBox();
this.trackBarBindingSource = new System.Windows.Forms.BindingSource(this.components);
this.label1.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.trackBarBindingSource, "Value", true));
this.textBox1.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.trackBarBindingSource, "Value", true));
DataBindings.Add方法有6个重载。分别是:属性名、数据源、数据成员、格式化使能、数据源更新模式、数据源为空时的默认值。因此,我们可以这样写:
private void Form1_Load(object sender, EventArgs e)
{
BindingSource source = new BindingSource();
source.DataSource = this.trackBar1;
this.textBox1.DataBindings.Add("Text", source, "Value");
this.label1.DataBindings.Add("Text", source, "Value");
}
默认的数据源更新模式:验证后更新。
绑定自定义数据类型
现在我们自定义一个类,类拥有属性Value
public class MyClass
{
public int Value { get; set; }
}
更改一下绑定代码:
MyClass mycls = new MyClass();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
BindingSource source = new BindingSource();
source.DataSource = mycls;
//为了使现象更明显,使用立即更新模式
this.trackBar1.DataBindings.Add("Value", source, "Value",true,DataSourceUpdateMode.OnPropertyChanged);
this.textBox1.DataBindings.Add("Text", source, "Value", true, DataSourceUpdateMode.OnPropertyChanged);
this.label1.DataBindings.Add("Text", source, "Value", true, DataSourceUpdateMode.OnPropertyChanged);
}
private void button1_Click(object sender, EventArgs e)
{
//断点
}
可见,对控件的修改可以实时反馈到类对象上。但当我们修改类对象属性时,控件在这时不会更改,如果想要类属性修改是可以实时反馈到控件上,我们需要实现 INotifyPropertyChanged接口。
public class MyClass:INotifyPropertyChanged
{
private int _value;
public int Value
{
get => _value;
set
{
_value = value;
OnPropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}