MSDN:
绑定示意图
概念:
DataContext: 参与数据绑定时的数据上下文,此上下文是可继承的,当然子控件也可以指定自已的DataContext来重写父控件的DataContext
目标UI属性:指要绑定到UI上的属性,可用作或显或更改数据,是FrameworkElement 的任一 DependencyProperty(依赖属性)
数据流方向:指数据的流向,有三种 OneTime,OneWay,TwoWay,是通过Binding的Mode属性设置的
值转换器(可选): 指将数据从UI到绑定源之间的转换,是一个实现了 IValueConverter 的类
最简单的绑定:
XAML:
定义一个类
public class hwj { public string Name { get; set; } }
绑定代码:
hwj h = new hwj(); h.Name = "hwj383"; //this.LayoutRoot.DataContext = h;//指定Grid的DataContext也可以,因是textBox是Grid的子控件 this.textBox.DataContext = h;
效果如下:
使用代码完成绑定
Binding bind = new Binding("Name"); //Name指绑定路径 bind.Source = h;//或者指定 his.textBox.DataContext = h; bind.Mode = BindingMode.OneTime; //数据流向 bind.Converter = new MyConverter();//自定义值转换器 //bind.ConverterCulture //转换的地区文化 //bind.ConverterParameter//转换的参数 //bind.ElementName//绑定源的控件名称 //bind.NotifyOnValidationError// //bind.RelativeSource// //bind.UpdateSourceTrigger// //bind.ValidatesOnExceptions// textBox.SetBinding(TextBox.TextProperty, bind);//绑定,调用值转换方法 public class MyConverter : IValueConverter { #region IValueConverter 成员 public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { //从源到UI转换,targetType指示SetBinding中的依赖属性的 Type, parameter转换参数, culture return value + "源到UI"; } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return value + "UI到源"; } #endregion }
因为,Binding已指定所有内容,所以XAML不需要Bing属性
数据流的三种流方式:
OneTime:创建绑定时更新目标属性。
OneWay:创建绑定时更新目标属性。对源对象的更改也会传播到目标。(源 --> UI属性)
TwoWay:在进行任一更改时会相应更新目标或源对象。创建绑定后,目标属性从源进行更新。 (源 <--> UI属性)
其中: OneWay和TwoWay要实现INotifyPropertyChanged (属性更改)或 INotifyCollectionChanged(集合更改,如ItemControl失集合绑定) 接口
在实现您自己的集合之前,应考虑使用 ObservableCollection<(Of <(<'T>)>)> 类,该类具有 INotifyCollectionChanged 和 INotifyPropertyChanged 的内置实现。
一个实现了 INotifyPropertyChanged 的类(类A)
public class hwj : INotifyPropertyChanged { #region INotifyPropertyChanged 成员 public event PropertyChangedEventHandler PropertyChanged; #endregion private string name; public string Name { get { return name; } set { if(value.length > 6) { throw new Exception("姓名长度必须小于7位"); } name = value; PropertyChangedMethod("Name"); } } public void PropertyChangedMethod(string property) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(property)); } } }
这样当UI属性绑定到源时
如果使用其OneWay绑定时,对数据源中的数据如Name修改时,会自动反映到UI属性上面.
如果使用其TwoWay绑定是,对数据或UI的属性更改都会相应反映到UI属性或源上.
注意:
在 TwoWay 绑定中,对目标的更改会自动更新源,但绑定到 TextBox 的 Text 属性时除外。这种情况下,更新仅在 TextBox 失去焦点时发生。
有时我们并不想U属性的更新立即反映到源,而是通过我们自动控制.
这时需要没置 Binding 的
Binding bind = new Binding("Name"); bind.UpdateSourceTrigger = UpdateSourceTrigger.Explicit;//[意为:明确的]
Or
然后在后端通过:
BindingExpression expression = textBox.GetBindingExpression(TextBox.TextProperty);//取得绑定表达式 expression.UpdateSource();//更新源
这样就得以手动控制保进更新源.
Silverlight 支持在 TwoWay 绑定中对从目标到源的更新进行基本数据验证。在发生以下情况时,Silverlight 会报告验证错误:
在绑定引擎的类型转换器中引发了异常。
在绑定对象的 set 访问器中引发了异常。
在应用到数据对象或成员的验证属性中引发了异常。
将 ValidatesOnExceptions 设置为 true 的作用是告知绑定引擎在发生异常时创建验证错误。将 NotifyOnValidationError 设置为 true 的作用是告知绑定引擎在验证错误发生和解决时引发 BindingValidationError 事件。例如,您可以处理错误事件,以便记录错误或提供其他可视反馈。
若要处理 BindingValidationError 事件,请在目标对象或其任一父级上创建一个事件处理程序。BindingValidationError 事件为路由事件,因此如果不在引发该事件的元素上予以处理,它将不断向上冒泡,直到得到处理。
如果设置 Binding的 ValidatesOnExceptions 为True 和 NotifyOnValidationError 为True,还会得到错误提示反馈.
如(见上面类A的定义)