在非焦点控件上执行某些操作时强制绑定更新

时间:2014-12-01 15:27:09

标签: c# wpf data-binding

我遇到了一个问题,我以非优雅的方式解决了这个问题,并且想知道是否有更好的解决方案。

我有一个View,它可能有文本框,只有在失去焦点时才更新它们的绑定(它们的绑定属性使用UpdateSourceTrigger=LostFocus)。这几乎是"正确...我可以将约束UpdateSourceTrigger设置为PropertyChanged,我不会遇到问题,一切都会按预期工作......但是,有一些可能是计算上的在更新这些绑定属性时发生了一些昂贵的事情(涉及对编辑对象的深度检查可能会变长)所以我实际上只想在完成编辑后更新绑定。

这对工具栏造成了问题,因为它们的按钮不可聚焦,因此单击它们(并发出命令)实际上并没有使文本框失去焦点,所以当执行命令时,绑定没有&#39 ; t更新(想象一个实体编辑视图,带有工具栏' Save'按钮,当点击时调用实际保存实体的保存命令。在这种情况下,实体将保存为值文本框失去焦点之前)

我可以在提升命令和更新源之前检查绑定(这是我现在正在做的事情),但这意味着:

  • 可以访问执行命令的绑定(或控件)。这完全不适合解决方案而被丢弃。命令操作在其他一些应该与WPF无关的库上定义。
  • 在代码隐藏事件处理程序上执行命令并在引发命令之前执行绑定更新(或者只是将焦点设置为其他内容并让WPF更新源代码)。这就是我现在正在做的事情,它是我不喜欢的(如果有其他解决方案,我更喜欢将命令直接分配给工具栏按钮)。< / LI>
  • 让View界面有一个&#34; ForceEndEdit()&#34;只要我执行某些可能导致此问题的操作,View就会执行并调用它。我觉得这很奇怪,不愿意这样做。

有没有办法告诉WPF更新绑定&#34;每当用户调用命令时 - 或点击按钮 - 控件外部不一定失去焦点&#34; ?如果没有,有没有解决过这个问题的解决方案比上面提出的更优雅,我可能没有想过?

正如我所说,触发绑定更新OnPropertyChanged(这是我所见过的类似 - 虽然不完全相同的问题)在这种特殊情况下不是一个足够好的解决方案。

PS :这不仅适用于文本框,而且任何类型的编辑控件(日期选择器,范围选择器等)和那些控件都可能是第三方,我不会必须有权访问他们的源代码。

PS2 :我使用的是.NET 4.5

1 个答案:

答案 0 :(得分:2)

如果您在使用OnPropertyChanged()的{​​{1}}期间执行计算成本高昂的事情,则应考虑在UpdateSourceTrigger=PropertyChanged中使用Delay,以便Binding只更新一次用户已停止在控件中输入值。

这可以解决您的问题,因为它是基于交互时间的,而不是在启动更新之前依赖于某些其他事件/发生。此属性是.NET 4.5中的新属性,这就是我询问您使用的.NET版本的原因。