Silverlight中的数据绑定学习

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>)>)> 类,该类具有 INotifyCollectionChangedINotifyPropertyChanged 的内置实现。

 

一个实现了 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 绑定中,对目标的更改会自动更新源,但绑定到 TextBoxText 属性时除外。这种情况下,更新仅在 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的定义)

 

 

你可能感兴趣的:(SilverLight学习记录)