在无法聚焦的控件上执行某些操作时强制绑定更新
本文关键字:操作 更新 绑定 执行 聚焦 控件 | 更新日期: 2023-09-27 18:32:43
我有一个问题,我已经以一种不优雅的方式解决了,想知道是否有更好的解决方案。
我有一个视图,其中可能有文本框,这些文本框仅在失去焦点时更新其绑定(其绑定属性使用 UpdateSourceTrigger=LostFocus
(。这是"几乎"正确的...我可以将绑定的UpdateSourceTrigger
设置为 PropertyChanged
,我不会有问题,一切都会按预期工作......但是,在更新这些绑定属性时会发生一些潜在的计算成本很高的事情(涉及对编辑对象的深度检查,这可能会变长(,所以我实际上只想在完成编辑后更新绑定。
这给工具栏带来了问题,因为它们的按钮不可聚焦,因此单击它们(并发出命令(实际上不会使文本框失去焦点,因此当执行命令时,绑定尚未更新(想想实体编辑视图,带有工具栏"保存"按钮,单击时调用实际保存实体的保存命令。在这种情况下,实体将在失去焦点之前与文本框的值一起保存(
我可以在发出命令并更新源代码之前检查绑定(这就是我现在正在做的事情(,但这意味着:
- 有权访问正在执行命令的绑定(或控件(。由于解决方案的完全不优雅,将其丢弃。命令操作是在某个其他库上定义的,这些库应该与 WPF 无关。
- 在引发命令之前,在代码隐藏事件处理程序上执行命令并执行绑定更新(或仅将焦点设置为其他内容并让 WPF 更新源(。这就是我现在正在做的事情,也是我不喜欢的(如果有其他解决方案,我更喜欢将命令直接分配给工具栏按钮(。
- 让视图接口有一个"ForceEndEdit((",视图会执行它,并在我执行一些可能造成此问题的操作时调用它。我觉得这很奇怪,宁愿不这样做。
有没有办法告诉 WPF 更新绑定"每当用户在控件外部调用命令或单击按钮时,不一定会失去焦点">?如果没有,你们中是否有人发现比上面提出的更优雅的解决方案,而我可能没有想到?
正如我所说,在这种特殊情况下,触发绑定更新OnPropertyChanged
(这是我看到的对类似(尽管不完全相同(问题提出的(不是一个足够好的解决方案。
PS:这不仅适用于文本框,也适用于任何类型的编辑控件(日期选择器、范围选择器等(,这些控件可能是第三方的,我不一定有权访问它们的源代码。
PS2:我使用的是 .NET 4.5
如果在OnPropertyChanged()
使用UpdateSourceTrigger=PropertyChanged
期间执行计算成本高的操作,则应考虑在Binding
中使用Delay
,以便仅在用户停止在控件中输入值后更新Binding
。
这可以解决您的问题,因为它是基于时间的交互,而不是在启动更新之前依赖于其他一些事件/发生。此属性是 .NET 4.5 中的新功能,这就是为什么我问您使用的是什么版本的 .NET。