有哪些不同的 WPF 绑定模式?
Posted
技术标签:
【中文标题】有哪些不同的 WPF 绑定模式?【英文标题】:What are the various WPF binding modes? 【发布时间】:2011-01-19 07:07:01 【问题描述】:不了解WPF中的各种数据绑定模式,如:
单向 双向 一次性 等等……这些模式分别是什么意思?
什么时候应该使用它们?
【问题讨论】:
【参考方案1】:OneWay
:当您希望绑定的属性更新用户界面时使用它。
TwoWay
:这与 OneWay
和 OneWayToSource
的组合具有相同的行为。绑定属性将更新用户界面,用户界面中的更改将更新绑定属性(例如,您可以将其与 TextBox
或 Checkbox
一起使用。)
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 源属性将侦听正在更改的目标属性并自行更新。 TextProperty
和 UserName
属性都将保持同步,如果其中一个发生更改,它们将相互更新。这是最昂贵的,因为绑定系统必须观察双方的变化。
OneWayToSource:如果目标属性发生变化,源属性也会发生变化。如果用户更改TextProperty
,UserName
属性将采用更改后的值。这又是中等成本,因为绑定系统只监视 Target 的变化。
OneTime:这在 Binding 的生命周期内只发生一次,当 Binding 发生时,Target 属性将更新为 Source 属性。这是成本最低的,并且对于需要显示静态数据的场景是可取的,例如Label
、TextBlock
等
如果您不提及任何内容,则每个 target 属性都有一个与其自身关联的默认绑定模式。例如。 TextBox
的 TextProperty
的默认绑定模式为 TwoWay
。对于TextBlock
的TextProperty
,这是一种方式。
建议您选择正确的模式,因为它可以帮助您减少应用程序延迟,尤其是在您的 UI 中有大量控件的情况下。
关于 MVVM 的更多信息here 是我写的一篇文章。
【讨论】:
以上是关于有哪些不同的 WPF 绑定模式?的主要内容,如果未能解决你的问题,请参考以下文章