数据绑定为基于 Silverlight 的应用程序提供了一种显示数据并与数据进行交互的简便方法。数据的显示方式独立于数据的管理。UI 和数据对象之间的连接或绑定使数据得以在这二者之间流动。绑定建立后,如果数据更改,则绑定到该数据的 UI 元素可以自动反映更改。同样,用户对 UI 元素所做的更改也可以在数据对象中反映出来。例如,如果用户编辑 TextBox 中的值,则基础数据值会自动更新以反映该更改。常用的一些绑定方案包括将 ListBox 绑定到标题列表,将输入窗体的 TextBox 绑定到客户数据对象,或者将 Image绑定到当前用户的照片;
为了充分理解数据绑定的概念,我们必须首先弄清楚绑定源和绑定目标的区别:
绑定目标:绑定目标就是我们一般需要进行绑定的UI元素的属性,比如TextBlock的Text属性等,既依赖属性(DependencyProperty);
绑定源:绑定源就是绑定目标欲绑定的源对象,可以是任何 CLR 对象,包括目标元素本身或者其他 UI 元素。如果目标处于某一数据模板中,则源可以是该模板应用于的 UI 元素。
数据流的方向:该值有Binding对象的Mode属性指定,分为OneWay单向,仅从数据源绑定到目标,TwoWay双向,可从数据源绑定到目标,目标的更改也可以反馈给数据源,发生更新,以及OneTime,表示仅从数据源加载一次数据。
值转换器:有时我们需要把绑定到前台的数据做特定的转换,比如把DateTime类型值转换为时间等等,这时就需要用到值转换器,值转换器是一个实现 IValueConverter的类。
将数据连接到用户界面元素
示例:下列程序将 TextBox 的 Foreground 属性绑定到 SolidColorBrush,以便文本的颜色可以基于数据发生变化。在此方案中,Foreground 属性为绑定目标,而 SolidColorBrush 对象为绑定源。绑定源是 MyColors 类的属性,数据流方向为OneWay
XAML:
<TextBox x:Name="MyTextBox" Text="Text" Foreground="{Binding Brush1, Mode=OneWay}"/>
C#:
//创建一个实现了INotifyPropertyChanged接口的MyColors类的实例 MyColors textcolor = new MyColors(); // 初始化Brush1属性的值 textcolor.Brush1 = new SolidColorBrush(Colors.Red); // 绑定 MyTextBox.DataContext = textcolor;
为了使源对象的更改能够传播到目标,源必须实现 INotifyPropertyChanged 接口。INotifyPropertyChanged 具有 PropertyChanged 事件,该事件通知绑定引擎源已更改,以便绑定引擎可以更新目标值。在下面的代码中,MyColors 类为 OneWay 绑定实现 INotifyPropertyChanged接口。
// Create a class that implements INotifyPropertyChanged. public class MyColors : INotifyPropertyChanged { private SolidColorBrush _Brush1; // Declare the PropertyChanged event. public event PropertyChangedEventHandler PropertyChanged; // Create the property that will be the source of the binding. public SolidColorBrush Brush1 { get { return _Brush1; } set { _Brush1 = value; // Call NotifyPropertyChanged when the source property // is updated. NotifyPropertyChanged("Brush1"); } } // NotifyPropertyChanged will raise the PropertyChanged event, // passing the source property that is being updated. public void NotifyPropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } }
上述示例使绑定引擎创建一个绑定(默认为 OneWay方式),将 TextBox 的 Foreground 属性连接到 TextColor 对象的 brush1 属性