有哪些不同的 WPF 绑定模式?

Posted

技术标签:

【中文标题】有哪些不同的 WPF 绑定模式?【英文标题】:What are the various WPF binding modes? 【发布时间】:2011-01-19 07:07:01 【问题描述】:

不了解WPF中的各种数据绑定模式,如:

单向 双向 一次性 等等……

这些模式分别是什么意思?

什么时候应该使用它们?

【问题讨论】:

【参考方案1】: OneWay:当您希望绑定的属性更新用户界面时使用它。 TwoWay:这与 OneWayOneWayToSource 的组合具有相同的行为。绑定属性将更新用户界面,用户界面中的更改将更新绑定属性(例如,您可以将其与 TextBoxCheckbox 一起使用。) OneTime:这与OneWay 具有相同的行为,除了它只会更新一次用户界面。这应该是您绑定的默认选择(出于各种原因,我不会在这里详细说明)。如果您确实需要额外的功能,您应该只使用其他类型的绑定。 OneWayToSource:这与OneWay 正好相反——用户界面值更改会更新绑定属性。

如果您不指定任何内容,则行为将取决于您使用的控件。

有关详细信息,请参阅 Microsoft Docs 上的 BindingMode 枚举。

【讨论】:

谢谢。这很有帮助...但是请指定 TwoWay 示例...我想知道它如何反映代码隐藏。 @DATT:“指定”是什么意思?基本上,如果您在 XAML 中设置 Mode=TwoWay,当您更改 GUI 值时,它会自动更新 C# 属性。但是您在代码隐藏中的属性需要在实现 INotifyPropertyChanged 接口的类(如 ViewModel)中实现。当后台代码通过 set 改变属性的值时,需要调用 PropertyChanged 来通知 GUI 值的改变,它会自动更新。 如果您不指定任何内容,则行为将取决于您使用的 PROPERTY。【参考方案2】:

一个绑定由两个实体组成:

    源(通常是 MVVM 场景中的 ViewModel) 目标(UI 控件)

目标必须是DependencyObject(用于绑定工作),源可以是DependencyObject,或者它应该有一些机制来模仿WPF绑定系统来改变它(实现INotifyPropetyChnaged接口)。


MVVM 建议 ViewModel 项目没有任何与 View 相关的引用,因此建议使用INotifyPropertyChanged 接口来使 WPF 绑定听到 Source 对象。 Source 的属性和 Target 的属性之间发生绑定(必须是 DependencyProperty)。 例如TextBox 类的 TextProperty 是 DataBound 到(比如)视图模型的 UserName 属性。 WPF 绑定提供四种类型的绑定。请记住,Binding 在 UI 线程上运行,除非您指定它以其他方式运行。

    OneWay目标属性 将监听正在更改的源属性并自行更新。如果您以编程方式更改 ViewwModel 的 UserName 属性,它将反映在文本框中。这是中等成本,因为绑定系统只监视来源的变化。 TwoWay:目标属性将侦听正在更改的源属性并自行更新。 AND 源属性将侦听正在更改的目标属性并自行更新。 TextPropertyUserName 属性都将保持同步,如果其中一个发生更改,它们将相互更新。这是最昂贵的,因为绑定系统必须观察双方的变化。 OneWayToSource:如果目标属性发生变化,源属性也会发生变化。如果用户更改TextPropertyUserName 属性将采用更改后的值。这又是中等成本,因为绑定系统只监视 Target 的变化。 OneTime:这在 Binding 的生命周期内只发生一次,当 Binding 发生时,Target 属性将更新为 Source 属性。这是成本最低的,并且对于需要显示静态数据的场景是可取的,例如LabelTextBlock

如果您不提及任何内容,则每个 target 属性都有一个与其自身关联的默认绑定模式。例如。 TextBoxTextProperty 的默认绑定模式为 TwoWay。对于TextBlockTextProperty,这是一种方式。

建议您选择正确的模式,因为它可以帮助您减少应用程序延迟,尤其是在您的 UI 中有大量控件的情况下。

关于 MVVM 的更多信息here 是我写的一篇文章。

【讨论】:

以上是关于有哪些不同的 WPF 绑定模式?的主要内容,如果未能解决你的问题,请参考以下文章

MVVM设计模式和在WPF中的实现 事件绑定

wpf的特点和优点哪些?

只写模式下的 WPF 数据绑定控件

WPF使用MVVM设计模式 问题

WPF绑定Binding及模式

WPF DataGrid 验证/绑定模式错误