我听说过很多关于 WPF 中的双向绑定的信息,但我并不完全清楚如何完成它或它的实际含义。
我有一个ListView
里面有一堆东西。当用户选择一个新项目时,TextBox
应用程序中的 a 将更改其文本以显示所选项目的某些属性。
但是当用户更改文本框中的文本时,我希望该ListView
项目也立即更新。是否有任何“双向绑定”神奇的 WPF 方式来实现这一点?
我听说过很多关于 WPF 中的双向绑定的信息,但我并不完全清楚如何完成它或它的实际含义。
我有一个ListView
里面有一堆东西。当用户选择一个新项目时,TextBox
应用程序中的 a 将更改其文本以显示所选项目的某些属性。
但是当用户更改文本框中的文本时,我希望该ListView
项目也立即更新。是否有任何“双向绑定”神奇的 WPF 方式来实现这一点?
马克的回答显示了如何完成您想要的,但您也更笼统地询问了“如何完成[双向绑定]及其实际含义”。
单向绑定意味着绑定目标(例如控件)将显示来自绑定源(例如业务对象)的数据,并且会随着业务对象的变化而自我更新,但对控件的更改不会传播回业务目的。例如,如果 Person.Name 从 "bob" 更改为 "kate",绑定到 Name 的 TextBlock.Text 也会从 "bob" 更改为 "kate"。
双向绑定仅仅意味着不仅业务对象中的更改反映在 UI 中,而且用户在 UI 中所做的更改也会传播回业务对象。因此,现在当用户编辑绑定到名称的 TextBox.Text 时,例如将“kate”更改为“edmund”,WPF 也会将 Person.Name 属性设置为“edmund”。
为此,只需在 Binding 声明中设置 Mode=TwoWay。一些属性默认绑定双向:例如TextBox.Text,默认绑定双向,这就是Mark的代码不需要Mode声明的原因。此外,正如 Mark 所指出的,默认情况下 WPF 仅在控件失去焦点时才将更改传播回业务对象。如果您有两个 UI 元素绑定到同一个属性,这可能意味着它们看起来不同步,在这种情况下,您可以使用 UpdateSourceTrigger 来强制 WPF 在属性更改时传播。
MSDN 用一些清晰的图表详细介绍了这一点:请参阅WPF SDK 中的数据绑定概述。
如果还没有,则需要为INotifyPropertyChanged
要绑定的类实现。
此外,当您说您希望该ListBox
项目立即更新时,您的意思是您希望它在您键入TextBox
. 默认情况下,该TextBox.Text
属性在失去焦点时会更新其源,但您可以通过将绑定设置UpdateSourceTrigger
为PropertyChanged
:
{Binding Source={...}, Path=Whatever, UpdateSourceTrigger=PropertyChanged}
中的项目类型是ListView
什么?要获得两种方式绑定,您需要实现INotifyPropertyChanged
......
这可能有助于WPF 事件属性更改?