如何在WPF中完成双向数据绑定?

Den*_*gan 12 c# data-binding wpf two-way-binding

我在WPF中听说过很多关于双向绑定的内容,但我并不完全清楚如何实现它或它实际意味着什么.

我有ListView一堆物品.当用户选择新项目时,TextBox应用程序中的a将更改其文本以显示所选项目的某些属性.

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

ito*_*son 34

马克的答案显示了如何完成你想要的,但你也更广泛地询问了"如何完成[双向绑定]及其实际意义."

单向绑定意味着绑定目标(例如控件)将显示来自绑定源(例如业务对象)的数据,并将在业务对象更改时自行更新,但对控件的更改将不会传播回业务宾语.例如,如果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默认绑定TwoWay,这就是Mark的代码不需要Mode声明的原因.此外,正如Mark所说,默认情况下,WPF仅在控件失去焦点时将更改传播回业务对象.如果您有两个绑定到同一属性的UI元素,这可能意味着它们看起来不同步,在这种情况下,您可以使用UpdateSourceTrigger强制WPF在属性更改时传播.

MSDN通过一些清晰的图表详细介绍了这一点:请参阅WPF SDK中的数据绑定概述.


Mar*_*iec 11

如果你还没有,你需要INotifyPropertyChanged为你的班级实施你所约束的.

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

{Binding Source={...}, Path=Whatever, UpdateSourceTrigger=PropertyChanged}
Run Code Online (Sandbox Code Playgroud)

  • 根据他设置的方式,可能需要将Source更改为ElementName(具有SelectedItem.Whatever的Path),或者,如果绑定项的集合是DataContext,则可以省略,但在后一种情况下, ListView将需要IsSynchronizedWithCurrentItem ="True". (3认同)