https://docs.microsoft.com/zh-cn/dotnet/desktop/wpf/data/?view=netdesktop-6.0

数据绑定是在应用 UI 与其显示的数据之间建立连接的过程。 如果绑定具有正确的设置,并且数据提供适当的通知,则在数据更改其值时,绑定到该数据的元素会自动反映更改。 数据绑定还意味着,如果元素中数据的外部表示形式发生更改,则基础数据可以自动进行更新以反映更改。 例如,如果用户编辑<font style="color:rgb(23, 23, 23);">TextBox</font>元素中的值,则基础数据值会自动更新以反映该更改。 数据绑定的典型用法是将服务器或本地配置数据放置到窗体或其他 UI 控件中。 此概念在 WPF 中得到扩展,包括将大量属性绑定到不同类型的数据源。 在 WPF 中,元素的依赖属性可以绑定到 .NET 对象(包括 ADO.NET 对象或与 Web 服务和 Web 属性关联的对象)和 XML 数据。

数据绑定的基本概念

无论要绑定什么元素,也无论数据源是什么性质,每个绑定都始终遵循下图所示的模型:

MSDN文档——数据绑定 - 图1

如图所示,数据绑定实质上是绑定目标与绑定源之间的桥梁。该图演示了以下基本的WPF数据绑定概念:

  1. * 通常情况下,每个绑定具有四个控件:
  2. + 绑定目标对象
  3. + 目标属性
  4. + 绑定源
  5. + 指向绑定源中要使用的值的路径

例如,如果将<font style="color:rgb(23, 23, 23);">TextBox</font>的内容绑定到<font style="color:rgb(23, 23, 23);">Employee.Name</font>属性,则可以类似如下所示设置绑定:

MSDN文档——数据绑定 - 图2

  1. * 目标属性必须是依赖属性

大多数UIElement属性都是依赖属性,而大多数依赖属性(只读属性除外)默认支持数据绑定。只有从DependencyObject派生的类型才能定义依赖项属性。所有UIElement类型从DependencyObject派生。

  1. * 绑定源不限于自定义 .NET对象。

尽管未在图中显示,但请注意,绑定源对象不限于自定义.NET对象。WPF数据绑定支持.NET对象、XML甚至是XAML元素对象形式的数据。例如,绑定源可以是UIElement、任何列表对象、ADO.NET或Web服务对象,或包含XML数据的XmlNode。有关详细信息,参阅绑定源概述

请务必记住,在建立绑定时,需要将绑定目标绑定到绑定源。例如,如果要使用数据绑定在 ListBox 中显示一些基础 XML 数据,则需要将ListBox绑定到 XML 数据。

若要建立绑定,请使用 Binding对象。本文的其余部分讨论了与Binding对象相关的许多概念以及该对象的一些属性和用法。

数据上下文

当在XAML元素上声明数据绑定时,它们会通过查看其直接的DataContext属性来解析数据绑定。数据上下文通常是绑定源值路径评估的绑定源对象。可以在绑定中重写此行为,并设置特定的绑定源对象值。如果未设置承载绑定的对象的DataContext属性,则将检查父元素的DataContext属性,以此类推,直到XAML对象树的根。简而言之,除非在对象上显式设置,否则用于解析绑定的数据上下文将继承自父级。

绑定可以配置为使用特定的对象进行解析,而不是使用数据上下文进行绑定解析。例如,在将对象的前景色绑定到另一个对象的背景色时,将使用直接指定源对象。无需数据上下文,因为绑定在这两个对象之间解析。相反,未绑定到特定源对象的绑定使用数据上下文解析。 <font style="color:rgb(23, 23, 23);">DataContext</font>属性发生更改时,重新评估可能会受数据上下文影响的所有绑定。

数据流的方向

通过设置Binding.Mode来控制数据流。

下图演示了不同类型的数据流:

MSDN文档——数据绑定 - 图3

  • 通过 OneWay 绑定,对源属性的更改会自动更新目标属性,但对目标属性的更改不会传播回源属性。 如果绑定的控件为隐式只读,则此类型的绑定适用。 例如,可能会绑定到股票行情自动收录器这样的源,也可能目标属性没有用于进行更改的控件接口(例如表的数据绑定背景色)。 如果无需监视目标属性的更改,则使用 OneWay 绑定模式可避免 TwoWay 绑定模式的系统开销。
  • 通过 TwoWay 绑定,更改源属性或目标属性时会自动更新另一方。 此类型的绑定适用于可编辑窗体或其他完全交互式 UI 方案。 大多数属性默认为 OneWay 绑定,但某些依赖属性(通常为用户可编辑控件的属性,例如 TextBox.Text CheckBox.IsChecked)默认为 TwoWay 绑定。 用于确定依赖属性绑定在默认情况下是单向还是双向的编程方法是:使用 DependencyProperty.GetMetadata 获取属性元数据,然后检查 FrameworkPropertyMetadata.BindsTwoWayByDefault 属性的布尔值。
  • OneWayToSource 绑定与 OneWay 绑定相反;当目标属性更改时,它会更新源属性。 一个示例方案是只需要从 UI 重新计算源值的情况。
  • OneTime 绑定未在图中显示,该绑定会使源属性初始化目标属性,但不传播后续更改。 如果数据上下文发生更改,或者数据上下文中的对象发生更改,则更改不会在目标属性中反映。 如果适合使用当前状态的快照或数据实际为静态数据,则此类型的绑定适合。 如果你想使用源属性中的某个值来初始化目标属性,且提前不知道数据上下文,则此类型的绑定也有用。 此模式实质上是 OneWay 绑定的一种简化形式,它在源值不更改的情况下提供更好的性能。
若要检测源更改(适用于 OneWay TwoWay 绑定),则源必须实现合适的属性更改通知机制,例如 INotifyPropertyChanged。 请参阅如何:实现属性更改通知 (.NET Framework),获取 INotifyPropertyChanged 实现的示例。

Binding.Mode 属性提供有关绑定模式的详细信息,以及如何指定绑定方向的示例。