【问题标题】:How to bind a WPF control to multiple sources but only display the most most recently updated source如何将 WPF 控件绑定到多个源但仅显示最近更新的源
【发布时间】:2020-11-12 05:46:53
【问题描述】:

我有一个要绑定到两个源(源 A 和源 B)的文本框。 我想在更新时显示源 A,在用户提供输入时显示源 B。 我不想同时显示来自两个来源的数据。

我尝试使用优先级绑定,但这似乎没有按我想要的方式工作。

<TextBox>

<TextBox.Text>
    <PriorityBinding>
        <Binding ElementName="Features_ComboBox" Path="SelectedItem.Address" Mode="OneWay" />
        <Binding Path="UserAddress" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay"/>
    </PriorityBinding>
</TextBox.Text>

<TextBox>

理想情况下,文本框将在“Features_ComboBox”选定项更改时更新,但如果用户在文本框中写入,它将更新“UserAddress”属性(因此是模式设置)。

相反,“Features_ComboBox”会更新文本框,但 UserAddress 永远不会更新。

我也尝试过使用 MultiBinding,但不太成功。 任何想法如何做到这一点?

【问题讨论】:

  • 恐怕您必须为此使用行为。具有您的 2 个绑定源的行为,并且该行为只是直接将它们的值分配给您的文本框。
  • 是的,看来我需要使用一种行为——我不熟悉行为的工作原理,我的下一步是弄清楚这一点。感谢您为我指明正确的方向。

标签: c# wpf data-binding binding


【解决方案1】:

来自the documentation:

绑定引擎从列表中的第一个绑定开始,并验证该绑定是否成功返回值;如果是,则使用该绑定中的值。如果第一个绑定没有成功返回值,绑定引擎会检查第二个绑定是否成功返回值;如果是,则来自第二个绑定的值将成为活动值。此验证过程继续到绑定列表的末尾。如果没有任何绑定成功返回值,则绑定使用 FallbackValue。

绑定引擎继续监听所有绑定的变化。 如果在任何时候具有更高优先级的绑定之一成功返回值,则该绑定的值将成为活动值并替换当前值。

请注意,要使用的Binding 的选择仅基于对绑定源的更新。如果源未更改,则活动绑定不会更改。此外,在您自己的示例中,即使源属性 UserAddress 已更改,该绑定仍然不会激活,因为您将 Binding 对象置于比 ComboBox 绑定低的优先级。

PriorityBinding 对象将始终更喜欢其列表中的更高优先级,即更早排序的绑定。只要该绑定产生值,就不会选择其他绑定。

PriorityBinding 对象根本没有您想要的行为。这是针对一种完全不同的场景。

我建议您在视图模型中解决问题。例如,您可以将ComboBox 和TextBox 绑定到单独的视图模型属性。然后在视图模型中,如果ComboBox 选择被修改,您可以将该数据显式复制到TextBox 的source 属性,然后更新TextBox.Text 属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    相关资源
    最近更新 更多