我遇到了一个问题,我以非优雅的方式解决了这个问题,并且想知道是否有更好的解决方案。
我有一个View,它可能有文本框,只有在失去焦点时才更新它们的绑定(它们的绑定属性使用UpdateSourceTrigger=LostFocus
)。这几乎是"正确...我可以将约束UpdateSourceTrigger
设置为PropertyChanged
,我不会遇到问题,一切都会按预期工作......但是,有一些可能是计算上的在更新这些绑定属性时发生了一些昂贵的事情(涉及对编辑对象的深度检查可能会变长)所以我实际上只想在完成编辑后更新绑定。
这对工具栏造成了问题,因为它们的按钮不可聚焦,因此单击它们(并发出命令)实际上并没有使文本框失去焦点,所以当执行命令时,绑定没有&#39 ; t更新(想象一个实体编辑视图,带有工具栏' Save'按钮,当点击时调用实际保存实体的保存命令。在这种情况下,实体将保存为值文本框失去焦点之前)
我可以在提升命令和更新源之前检查绑定(这是我现在正在做的事情),但这意味着:
有没有办法告诉WPF更新绑定"每当用户调用命令时 - 或点击按钮 - 控件外部不一定失去焦点" ?如果没有,有没有解决过这个问题的解决方案比上面提出的更优雅,我可能没有想过?
正如我所说,触发绑定更新OnPropertyChanged
(这是我所见过的类似 - 虽然不完全相同的问题)在这种特殊情况下不是一个足够好的解决方案。
PS :这不仅适用于文本框,而且任何类型的编辑控件(日期选择器,范围选择器等)和那些控件都可能是第三方,我不会必须有权访问他们的源代码。
PS2 :我使用的是.NET 4.5
答案 0 :(得分:2)
如果您在使用OnPropertyChanged()
的{{1}}期间执行计算成本高昂的事情,则应考虑在UpdateSourceTrigger=PropertyChanged
中使用Delay
,以便Binding
只更新一次用户已停止在控件中输入值。
这可以解决您的问题,因为它是基于交互时间的,而不是在启动更新之前依赖于某些其他事件/发生。此属性是.NET 4.5中的新属性,这就是我询问您使用的.NET版本的原因。