【发布时间】:2015-01-29 15:36:12
【问题描述】:
我有一个问题,我以一种不优雅的方式解决了,想知道是否有更好的解决方案。
我有一个视图,它可能包含仅在失去焦点时更新其绑定的文本框(它们的绑定属性使用UpdateSourceTrigger=LostFocus)。这是“几乎”正确的......我可以将绑定的UpdateSourceTrigger 设置为PropertyChanged,我不会有问题,一切都会按预期工作......但是,有一些潜在的计算昂贵的东西发生在更新这些绑定属性(涉及对已编辑对象的深度检查,这可能会很长时间)所以我实际上只想在完成编辑后更新绑定。
这是工具栏的问题,因为它们的按钮不可聚焦,因此单击它们(并发出命令)实际上不会使文本框失去焦点,因此在执行命令时,绑定尚未更新(考虑一个带有工具栏“保存”按钮的实体编辑视图,单击该按钮时会调用一个实际保存实体的保存命令。在这种情况下,实体将在失去焦点之前与文本框的值一起保存)
我可以在发出命令之前检查绑定并更新源(这就是我现在正在做的),但这意味着:
- 有权访问执行命令的绑定(或控件)。由于解决方案完全不优雅,因此将其丢弃。命令操作是在其他一些应该与 WPF 无关的库上定义的。
- 在代码隐藏事件处理程序上执行命令并执行绑定更新(或只是将焦点设置到其他内容并让 WPF 更新源),然后再引发命令。这是我现在正在做的,也是我不喜欢的(如果有其他解决方案,我更愿意将命令直接分配给工具栏按钮)。
- 让 View 界面有一个“ForceEndEdit()”,当我执行一些可能会导致此问题的操作时,View 会执行并调用它。我觉得这很奇怪,我不想这样做。
有没有办法告诉 WPF 更新绑定“每当用户在控件之外调用命令 - 或单击按钮 - 不一定失去焦点”?如果没有,你们中的任何人有没有找到比上面提出的更优雅的解决方案,而我可能没有想到?
正如我所说,在这种特殊情况下,触发绑定更新 OnPropertyChanged(这是我所看到的类似 - 虽然不相同 - 问题的建议)并不是一个足够好的解决方案。
PS:这不仅适用于文本框,还适用于任何类型的编辑控件(日期选择器、范围选择器等),这些控件可能是第三方的,我不一定有访问他们的源代码。
PS2:我使用的是 .NET 4.5
【问题讨论】:
-
您使用的是什么版本的 .NET?
-
4.5,对不起,将添加到问题中
标签: c# wpf data-binding