数据绑定可以是 Xaml 内部的绑定,也可是 Xaml 中某个控件的某个属性与代码中某个变量之间的绑定,这里首先介绍一下后者:
首先,我们需要将要绑定的对象包装一下,像向面这样:
public abstract class BindableObject : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { var propertyChanged = PropertyChanged; if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } }
protected void SetProperty<T> (ref T item, T value, string propertyName = null) { if (!EqualityComparer<T>.Default.Equals(item, value)) { item = value; OnPropertyChanged(propertyName); } } } 由于每个被绑定的对象都必需实现 INotifyPropertyChanged 接口,然而,并不是简单的实现了 PropertyChanged 就可以,好像还要对 PropertyChanged 做一下处理,所以就有了上面这个抽象类;它完成的对 INotifyPropertyChanged 的基本封装,使用我们在后面的操作时会方便许多; |
在完成了上面的类之后,接下来就需要用它来包装我们要绑定的对象了:
public class BtColor : BindableObject { private Brush btColor;
public BtColor() { this.btColor = Brushes.WhiteSmoke; }
public Brush BColor { get { return this.btColor; }
set { SetProperty<Brush>(ref this.btColor, value); } } } 是的,只要继承这个抽象类,然后实现你要绑定的变量的 getter 和 setter (注意 setter 的不同)这里我们需要将一个 Brush 对象与一个按键的 BackGround 属性绑定在一起,那么我们要对这个按键做什么呢? |
接下来我们需要在 Xaml 代码中做如下修改:
Background="{Binding BColor, Mode=TwoWay}" 使用 Binding 关键字,将 Background 与 BColor 变量绑定在一起;可是这个 BColor 又是谁呢? 是的,我们也看到上面的BtColor类中我们实现了 BColor,可是这样就可以了吗? 当然不够,因为我们还没有实现BtColor类,所以我们还要在后台代码中加入如下内容: private BtColor btColor; this.btColor = new BtColor(); BtBorder.DataContext = btColor; 这里我们创建了一个类BtColor的对象,并将它赋值给BtBorder的DataContext属性,是的,这就是那关键一步,在这之后BtBorder就知道那个BColor是谁了! |
在完成了上面的操作之后,按键的背景色就会随着BColor的变化而实时更新了,但是这里还有一点需要注意,那就是,在这之后不能再直接使用BtBorder对象来修改它的Background属性,否则数据绑定会失效;