绑定引擎从Binding对象获取以下方面的信息:目标UI属性,用于显示数据,并且可能允许用户对数据进行更改。目标可以是FrameworkElement的任一DependencyProperty。在S
绑定引擎从 Binding 对象获取以下方面的信息:
目标 UI 属性,用于显示数据,并且可能允许用户对数据进行更改。目标可以是 FrameworkElement 的任一 DependencyProperty。在 Silverlight 4 中,在以下情况下目标还可以是 DependencyObject 的 DependencyProperty:
DependencyObject 是 FrameworkElement 的某个属性的值。
DependencyObject 在一个作为 FrameworkElement 属性的值的集合中(例如,Resources 属性)。
DependencyObject 在 DependencyObjectCollection<(Of <(<'T>)>)> 中。
包含在源和目标之间流动的数据的源对象。源可以是任何 CLR 对象,包括目标元素本身或者其他 UI 元素。如果目标处于某一数据模板中,则源可以是该模板应用于的 UI 元素。
数据流的方向。该方向是通过设置 Binding 对象的 Mode 属性指定的。
可选值转换器,适用于所传递的数据。值转换器是一个实现 IValueConverter 的类。
例如,可以将 TextBox 的 Foreground 属性绑定到 SolidColorBrush,以便文本的颜色可以基于数据发生变化。在此方案中,Foreground 属性为绑定目标,而 SolidColorBrush 对象为绑定源。
下面的示例演示如何使用代码和 XAML 将 TextBox 的 Foreground 颜色绑定到 SolidColorBrush。绑定源是 MyColors 类的属性
页面代码:
后台代码:
说明:
该绑定是在 XAML 中使用 {Binding ...} 语法创建的。绑定源是通过在代码中为 TextBox 设置 DataContext 属性而设置的。
数据上下文是可继承的。如果对父元素设置了数据上下文,则其所有子元素都将使用这一数据上下文。子元素可以通过以下方式来重写此行为:对其绑定对象设置 Source 属性或者设置其 DataContext(之后将应用于其所有子级)。
如果希望拥有多个绑定且所有这些绑定使用同一个源,则设置数据上下文会很有用。若要设置单个绑定的源,请对 Binding 对象设置 Source 属性。
还可以使用 ElementName 属性或 RelativeSource 属性指定绑定源。当绑定到应用程序中的其他元素时(例如在使用滑块调整按钮的宽度时),ElementName 属性是很有用的。当在 ControlTemplate 或 Style 中指定绑定时,RelativeSource 属性是很有用的。
您可以通过设置 Binding..::..Path 属性,绑定到源对象的某一属性。Path 属性支持用于绑定到嵌套属性、附加属性、字符串索引器的多种语法选项。
总之,上述示例使绑定引擎创建一个绑定(默认为 OneWay),将 TextBox 的 Foreground 属性连接到 TextColor 对象的 brush1 属性。
数据流的方向:
每个绑定都有一个 Mode 属性,该属性决定数据流动的方式和时间。Silverlight 支持以下三种类型的绑定:
创建 OneTime 绑定时,该绑定使用源数据更新目标。
创建 OneWay 绑定时以及每当源数据发生变化时,该绑定使用源数据更新目标。这是默认模式。
当目标和源有一个发生变化时,TwoWay 绑定既更新目标也更新源。或者,您可以禁用自动源更新,只在您选择的时间对源进行更新。
为了能够发生自动目标更新,源对象必须实现 INotifyPropertyChanged 接口,如下一部分所述。
更改通知:
为了使源对象的更改能够传播到目标,源必须实现 INotifyPropertyChanged 接口。INotifyPropertyChanged 具有 PropertyChanged 事件,该事件通知绑定引擎源已更改,以便绑定引擎可以更新目标值。
在下面的示例中,MyColors 类为 OneWay 绑定实现 INotifyPropertyChanged 接口。
若要获取绑定到 ItemsControl 的集合的更改通知,除了实现 INotifyPropertyChanged 外,还要实现 INotifyCollectionChanged。如果实现 INotifyCollectionChanged,对集合的更改(例如添加或移除对象)将传播到目标。若要获取集合中对象的属性更改通知,这些对象必须实现 INotifyPropertyChanged。
在实现您自己的集合之前,应考虑使用 ObservableCollection<(Of <(<'T>)>)> 类,该类具有 INotifyCollectionChanged 和 INotifyPropertyChanged 的内置实现。
更新数据源:
在 TwoWay 绑定中,对目标的更改会自动更新源,但绑定到 TextBox 的 Text 属性时除外。这种情况下,更新仅在 TextBox 失去焦点时发生。
您可以禁用自动源更新,只在您选择的时间对源进行更新。例如,您可以这样做,以便在更新绑定数据源之前验证来自多个控件的用户输入。
若要禁用自动源更新,请将 UpdateSourceTrigger 属性设置为 Explicit。此设置影响使用相同 Binding 对象的所有绑定(例如,在使用继承的数据上下文时)。但是,您必须为每个绑定单独更新源。若要更新某一绑定,请首先调用目标元素的 FrameworkElement..::..GetBindingExpression 方法,并且传递到目标 DependencyProperty 中。然后,可以使用返回值调用 BindingExpression..::..UpdateSource 方法。下面的示例代码演示了此过程。
页面代码:
后台代码:
本站技术原创栏目文章均为中睿原创或编译,转载请注明:文章来自中睿,本站保留追究责任的权利。