【问题标题】:How to accomplish two-way data binding in WPF?WPF中如何实现双向数据绑定?
【发布时间】:2010-02-01 21:29:48
【问题描述】:

我听说过很多关于 WPF 中的双向绑定的信息,但我并不完全清楚如何完成它或它的实际含义。

我有一个ListView,里面有一堆东西。当用户选择一个新项目时,应用程序中的TextBox 将更改其文本以显示所选项目的某些属性。

但是当用户更改文本框中的文本时,我希望ListView 项目也立即更新。是否有任何“双向绑定”神奇的 WPF 方式来实现这一点?

【问题讨论】:

    标签: c# wpf data-binding two-way-binding


    【解决方案1】:

    Mark's answer 展示了如何实现您想要的,但您也更笼统地询问了“如何实现 [双向绑定] 以及它的实际含义。”

    单向绑定意味着绑定目标(例如控件)将显示来自绑定源(例如业务对象)的数据,并且会随着业务对象的变化而自我更新,但对控件的更改不会被传播回来到业务对象。例如。如果 Person.Name 从 "bob" 变为 "kate",绑定到 Name 的 TextBlock.Text 也会从 "bob" 变为 "kate"。

    双向绑定仅仅意味着不仅业务对象中的更改反映在 UI 中,而且用户在 UI 中所做的更改也会传播回业务对象。因此,现在当用户编辑绑定到 Name 的 TextBox.Text,例如将“kate”更改为“edmund”时,WPF 也会将 Person.Name 属性设置为“edmund”。

    为此,只需在 Binding 声明中设置 Mode=TwoWay。一些属性默认绑定双向:例如TextBox.Text,默认绑定双向,这就是Mark的代码不需要Mode声明的原因。此外,正如 Mark 所指出的,默认情况下,WPF 仅在控件失去焦点时才将更改传播回业务对象。如果您有两个 UI 元素绑定到同一个属性,这可能意味着它们看起来不同步,在这种情况下,您可以使用 UpdateSourceTrigger 来强制 WPF 在属性更改时传播。

    MSDN 用一些清晰的图表详细介绍了这一点:请参阅 WPF SDK 中的Data Binding Overview

    【讨论】:

    • 投了赞成票。浏览了大量搜索结果,所有这些结果都描述了如何实现双向数据绑定,但没有一个解释这个概念。你的帖子做得非常简洁。
    • 感谢这一点,尤其是“某些属性默认绑定双向:TextBox.Text,例如,默认绑定双向”这句话非常有帮助:)
    • 很遗憾,这篇文章不再可用。我不确定是否有等价物。
    【解决方案2】:

    如果还没有,则需要为要绑定的类实现 INotifyPropertyChanged

    另外,当您说您希望ListBox 项目立即更新时,您的意思是您希望它在您输入TextBox 时进行更改。默认情况下,TextBox.Text 属性在失去焦点时会更新其源,但您可以通过将绑定 UpdateSourceTrigger 设置为 PropertyChanged 来更改它:

    {Binding Source={...}, Path=Whatever, UpdateSourceTrigger=PropertyChanged}
    

    【讨论】:

    • 根据他的设置方式,可能需要将 Source 更改为 ElementName(使用 SelectedItem.Whatever 的路径),或者,如果绑定项的集合是 DataContext,则可以省略,但在后一种情况下,ListView 将需要 IsSynchronizedWithCurrentItem="True"。
    • 就像 itowlson 说的那样。非常感谢!
    【解决方案3】:

    ListView 中项目的类型是什么?要实现双向绑定,您需要实现 INotifyPropertyChanged...

    这可能有助于WPF event property changed?

    【讨论】:

    • 列表视图中的项目是实现INotifyPropertyChanged的对象。
    猜你喜欢
    • 2019-03-24
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    • 2021-01-27
    • 2013-02-02
    • 2010-09-24
    • 1970-01-01
    相关资源
    最近更新 更多