- Bingding是什么
WPF中的Binding注重表达的是一种像桥梁一样的关系,它的两端分别是Binding的源(Source)和目标(Target)。数据从哪里来哪里就是源,Binding是架在中间的桥梁,Binding的目标是数据要往哪去儿。一般情况下,Binding源是逻辑层的对象,Binging的目标是UI层的控件对象。
- Binding如何传递数据变化
前面说过数据源是一个对象,但一个对象身上可能有很多数据,这些数据又通过属性暴露给外界。其中你想通过Binding送到UI元素的数据,或者说UI元素关心的那个属性被称为Binding的路径(Path)。
Binding是一种自动机制,当属性值发生变化后,属性要有能力通知Binding,让Binding把变化传递给UI元素。这种能力的实现就是通过在属性的set语句中触发一个PropertyChanged事件。因此数据源要继承接口INotifyPropertyChanged,当为Binding设定了数据源后,Binding会自动侦听来自这个接口的PropertyChanged事件。
现在我们抽象一个类Car,但我们只关心他的价格,声明如下:
public classCar:INotifyPropertyChanged { public eventPropertyChangedEventHandler PropertyChanged; privateInt32 price; publicInt32 Price { get { returnprice; } set{ if (value !=price) { price =value; if (PropertyChanged != null) { this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Price")); } } } } }
然后我们在窗体上创建一个TextBox和Button。TextBox显示Car的Price,将作为Binding的目标,窗体代码如下:
<Window x:Class="WpfApplication1.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="Simple Binding"Height="150"Width="300"> <StackPanel> <TextBox x:Name="txtName"TextWrapping="Wrap"Text="TextBox"Margin="5"Height="27"/> <Button Content="降价10%"Click="Button_Click"Margin="5"Height="31"/> </StackPanel> </Window>
接下来我们在窗体的构造函数里使用Binding把数据源和UI元素链接起来,代码如下:
public partial classMainWindow : Window { Car myCar; publicMainWindow() { InitializeComponent(); //准备数据源 myCar= newCar(); //准备Binding Binding binding = newBinding(); binding.Source =myCar; binding.Path = new PropertyPath("Price"); //使用Binding链接数据源与Binding目标 BindingOperations.SetBinding(this.txtName, TextBox.TextProperty, binding); } }
根据Binding类的构造函数以及C#的对象初始化器语法来简化代码,代码如下:
this.txtName.SetBinding(TextBox.TextProperty, new Binding("Price") { Source = myCar = new Car() });
在Button的Click事件中改变属性Price的值,每点一次,Car的Price减少10%,代码如下:
private void Button_Click(objectsender, RoutedEventArgs e) { myCar.Price = myCar.Price / 10; }