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

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

  • 单向
  • 双向
  • 一次性
  • 等等……

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

什么时候应该使用它们?

【问题讨论】:

    标签: wpf data-binding


    【解决方案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】:

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

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

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


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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-12-07
      • 1970-01-01
      • 2023-03-15
      • 2018-12-16
      • 2011-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-13
      相关资源
      最近更新 更多