【发布时间】:2011-01-19 07:07:01
【问题描述】:
不了解WPF中的各种数据绑定模式,如:
- 单向
- 双向
- 一次性
- 等等……
这些模式分别是什么意思?
什么时候应该使用它们?
【问题讨论】:
标签: wpf data-binding
不了解WPF中的各种数据绑定模式,如:
这些模式分别是什么意思?
什么时候应该使用它们?
【问题讨论】:
标签: wpf data-binding
OneWay:当您希望绑定的属性更新用户界面时使用它。TwoWay:这与 OneWay 和 OneWayToSource 的组合具有相同的行为。绑定属性将更新用户界面,用户界面中的更改将更新绑定属性(例如,您可以将其与 TextBox 或 Checkbox 一起使用。)OneTime:这与OneWay 具有相同的行为,除了它只会更新一次用户界面。这应该是您绑定的默认选择(出于各种原因,我不会在这里详细说明)。如果您确实需要额外的功能,您应该只使用其他类型的绑定。OneWayToSource:这与OneWay 正好相反——用户界面值更改会更新绑定属性。如果您不指定任何内容,则行为将取决于您使用的控件。
有关详细信息,请参阅 Microsoft Docs 上的 BindingMode 枚举。
【讨论】:
一个绑定由两个实体组成:
目标必须是DependencyObject(用于绑定工作),源可以是DependencyObject,或者它应该有一些机制来模仿WPF绑定系统来改变它(实现INotifyPropetyChnaged接口)。
MVVM 建议 ViewModel 项目没有任何与 View 相关的引用,因此建议使用INotifyPropertyChanged 接口来使 WPF 绑定听到 Source 对象。
Source 的属性和 Target 的属性之间发生绑定(必须是 DependencyProperty)。
例如TextBox 类的 TextProperty 是 DataBound 到(比如)视图模型的 UserName 属性。
WPF 绑定提供四种类型的绑定。请记住,Binding 在 UI 线程上运行,除非您指定它以其他方式运行。
UserName 属性,它将反映在文本框中。这是中等成本,因为绑定系统只监视来源的变化。TextProperty 和 UserName 属性都将保持同步,如果其中一个发生更改,它们将相互更新。这是最昂贵的,因为绑定系统必须观察双方的变化。TextProperty,UserName 属性将采用更改后的值。这又是中等成本,因为绑定系统只监视 Target 的变化。Label、TextBlock 等如果您不提及任何内容,则每个 target 属性都有一个与其自身关联的默认绑定模式。例如。 TextBox 的 TextProperty 的默认绑定模式为 TwoWay。对于TextBlock 的TextProperty,这是一种方式。
建议您选择正确的模式,因为它可以帮助您减少应用程序延迟,尤其是在您的 UI 中有大量控件的情况下。
关于 MVVM 的更多信息here 是我写的一篇文章。
【讨论】: