首页 > 解决方案 > 如何将 WPF 控件绑定到多个源,但只显示最近更新的源

问题描述

我有一个要绑定到两个源(源 A 和源 B)的 TextBox。我想在更新时显示源 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,但我不太成功。任何想法如何做到这一点?

标签: c#wpfdata-bindingbinding

解决方案


文档中

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

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

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

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

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

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


推荐阅读