得鹿梦鱼 得鹿梦鱼

WPF数据绑定

WPF数据绑定为应用程序提供了一种表示数据和与数据交互的简单而又一致的方法。元素能够以公共语言运行库 CLR 对象和XML的形式绑定到各种数据源中的数据。

基本概念

  • 绑定源即控件绑定所使用的源数据
  • 绑定目标即数据显示的控件

绑定源

  • CLR对象:可以绑定到CLR类的公开的属性、子属性、索引器上
  • ADO.Net对象:例如DataTable、DataView等
  • XML文件:使用XPath进行解析
  • DependencyObject:绑定到其依赖项属性上,即控件绑定控件

绑定目标

必须是WPF中的DependencyObject,将数据绑定到其依赖项属性上

数据绑定示例图

绑定的基本方式

  1. OneWay绑定导致对源属性的更改会自动更新目标属性,但是对目标属性的更改不会传播回源属性。此绑定类型适用于绑定的控件为隐式只读控件的情况。例如,您可能绑定到如股票行情自动收录器这样的源,或许目标属性没有用于进行更改的控件接口(如表的数据绑定背景色)。如果无需监视目标属性的更改,则使用 OneWay 绑定模式可避免 TwoWay 绑定模式的系统开销
  2. TwoWay 绑定导致对源属性的更改会自动更新目标属性,而对目标属性的更改也会自动更新源属性。此绑定类型适用于可编辑窗体或其他完全交互式 UI 方案。大多数属性都默认为 OneWay 绑定,但是一些依赖项属性(通常为用户可编辑的控件的属性,如 TextBox 的 Text 属性和 CheckBox 的 IsChecked 属性)默认为 TwoWay 绑定。确定依赖项属性绑定在默认情况下是单向还是双向的编程方法是:使用 GetMetadata 获取属性的属性元数据,然后检查 BindsTwoWayByDefault 属性的布尔值
  3. OneWayToSource 与 OneWay 绑定相反;它在目标属性更改时更新源属性。一个示例方案是您只需要从 UI 重新计算源值的情况
  4. OneTime绑定 ,该绑定会导致源属性初始化目标属性,但不传播后续更改

数据绑定方式示例图

实现数据源更改影响目标更改

using System.ComponentModel;namespace BasicWPFDataBinding{    public class MyData : INotifyPropertyChanged    {        #region INotifyPropertyChanged Members        public event PropertyChangedEventHandler PropertyChanged;        #endregion        public MyData        {            Name = "Tom";        }        private string _Name;        public string Name        {            set            {            _Name = value;                 if PropertyChanged != null                {                    PropertyChangedthis,new PropertyChangedEventArgs"Name";                }            }             get            {                    return _Name;            }        }    }}

实现绑定目标的值更改影响绑定源的值

<TextBox Text="{Binding Path=Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

自定义这种绑定转换

自定义数据绑定示例图