- 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,但我们只关心他的价格,声明如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class Car:INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private Int32 price; public Int32 Price { get { return price; } set { if (value != price) { price = value; if (PropertyChanged != null) { this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Price")); } } } } }
然后我们在窗体上创建一个TextBox和Button。TextBox显示Car的Price,将作为Binding的目标,窗体代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<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元素链接起来,代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public partial class MainWindow : Window { Car myCar; public MainWindow() { InitializeComponent(); //准备数据源 myCar= new Car(); //准备Binding Binding binding = new Binding(); binding.Source = myCar; binding.Path = new PropertyPath("Price"); //使用Binding链接数据源与Binding目标 BindingOperations.SetBinding(this.txtName, TextBox.TextProperty, binding); } }
根据Binding类的构造函数以及C#的对象初始化器语法来简化代码,代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
this.txtName.SetBinding(TextBox.TextProperty, new Binding("Price") { Source = myCar = new Car() });
在Button的Click事件中改变属性Price的值,每点一次,Car的Price减少10%,代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
private void Button_Click(object sender, RoutedEventArgs e) { myCar.Price = myCar.Price / 10; }