c# - 如何将 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,但我不太成功。任何想法如何做到这一点?
解决方案
从文档中:
绑定引擎从列表中的第一个绑定开始,并验证该绑定是否成功返回值;如果是,则使用该绑定中的值。如果第一个绑定没有成功返回值,绑定引擎会检查第二个绑定是否成功返回值;如果是,则来自第二个绑定的值将成为活动值。此验证过程继续到绑定列表的末尾。如果没有任何绑定成功返回值,则绑定使用 FallbackValue。
绑定引擎继续监听所有绑定的变化。如果在任何时候具有更高优先级的绑定之一成功返回值,则该绑定的值将成为活动值并替换当前值。
请注意,Binding
要使用的选项的选择仅基于对绑定源的更新。如果源未更改,则活动绑定不会更改。此外,在您自己的示例中,即使源属性UserAddress
已更改,该绑定仍不会变为活动状态,因为您将Binding
对象置于低于ComboBox
绑定的优先级。
PriorityBinding
对象总是更喜欢其列表中优先级更高的,即更早排序的绑定。只要该绑定产生一个值,就不会选择其他绑定。
该PriorityBinding
对象根本没有您想要的行为。这是一种完全不同的场景。
我建议您在视图模型中解决问题。例如,您可以将ComboBox
和绑定TextBox
到单独的视图模型属性。然后在视图模型中,如果ComboBox
修改了选择,您可以将该数据显式复制到TextBox
的源属性,然后更新该TextBox.Text
属性。
推荐阅读
- sql - Oracle SQL 查询将使用子字符串删除重复项,并将重复记录列表链接到另一个表
- c# - 我们是否必须在 .NET 5 中保持异常可序列化?
- javascript - Owl Carousel 2 带有 mousewheel.js 并且没有循环
- javascript - Plain Vanilla JavaScript - 重置所有元素的外观
- c# - C#/Unity 中的延迟
- python - 我有这个功能,它接受维基百科页面的 html 代码。它需要永远运行,有什么想法可以让它更有效率吗?
- django - gunicorn.service:无法确定用户凭据:没有这样的过程
- python - 如何使用 python、matplotlib 和 opencv 生成视频?
- google-cloud-platform - 用于从 SFTP 服务器提取无服务器日志(下载文件)的 Google Cloud Platform 解决方案
- python - 如果值存在于第一列中,则从多维列表中检索键