我有一个问题,我已经以一种不太优雅的方式解决了它,并且想知道是否有更好的解决方法。
我的View可能具有文本框,只有在失去焦点时才会更新其绑定(它们绑定的属性使用
这会给工具栏带来问题,因为它们的按钮无法获得焦点,因此单击它们(并发出命令)实际上不会使文本框失去焦点,因此当执行命令时,绑定尚未更新(考虑到实体编辑视图,其中包含一个工具栏“保存”按钮,单击该按钮会调用保存命令,实际上保存实体。在这种情况下,实体将保存为失去焦点之前的文本框值)。
我可以在引发命令之前检查绑定并更新源(这就是我现在正在做的),但是这意味着:
要么:访问命令执行的绑定(或控件)。这被认为是不够优雅的解决方案。命令操作在其他库中定义,应该与WPF无关。
要么:在代码后台事件处理程序上执行命令,并在引发命令之前执行绑定更新(或仅将焦点设置为其他内容并允许WPF更新源)。这就是我现在正在做的事情,也是我不喜欢的事情(如果有其他解决方案,我更喜欢直接将命令分配给工具栏按钮)。
要么:View接口具有“ForceEndEdit()”,View执行它,并在我执行可能会引起此问题的操作时调用它。我觉得这相当奇怪,不想这样做。
是否有方法告诉WPF在用户调用命令或单击控件外的按钮时更新绑定,而不一定失去焦点?如果没有,是否有任何解决此问题的解决方案,比提出的上述解决方案更优雅,并且我可能没有想到?
如我所说,触发绑定更新
PS:这不仅适用于文本框,而且适用于任何类型的编辑控件(日期选择器,范围选择器等)。这些控件可能是第三方的,我不一定能访问它们的源代码。
PS2:我正在使用.NET 4.5
我的View可能具有文本框,只有在失去焦点时才会更新其绑定(它们绑定的属性使用
UpdateSourceTrigger=LostFocus
)。这几乎是正确的……我可以将绑定的UpdateSourceTrigger
设置为PropertyChanged
,我就不会有问题,而且一切都会按预期工作……但是,在更新这些绑定属性时可能发生一些计算上昂贵的东西(涉及对编辑对象的深入检查,可能会变长),因此我实际上只想在完成编辑后更新绑定。这会给工具栏带来问题,因为它们的按钮无法获得焦点,因此单击它们(并发出命令)实际上不会使文本框失去焦点,因此当执行命令时,绑定尚未更新(考虑到实体编辑视图,其中包含一个工具栏“保存”按钮,单击该按钮会调用保存命令,实际上保存实体。在这种情况下,实体将保存为失去焦点之前的文本框值)。
我可以在引发命令之前检查绑定并更新源(这就是我现在正在做的),但是这意味着:
要么:访问命令执行的绑定(或控件)。这被认为是不够优雅的解决方案。命令操作在其他库中定义,应该与WPF无关。
要么:在代码后台事件处理程序上执行命令,并在引发命令之前执行绑定更新(或仅将焦点设置为其他内容并允许WPF更新源)。这就是我现在正在做的事情,也是我不喜欢的事情(如果有其他解决方案,我更喜欢直接将命令分配给工具栏按钮)。
要么:View接口具有“ForceEndEdit()”,View执行它,并在我执行可能会引起此问题的操作时调用它。我觉得这相当奇怪,不想这样做。
是否有方法告诉WPF在用户调用命令或单击控件外的按钮时更新绑定,而不一定失去焦点?如果没有,是否有任何解决此问题的解决方案,比提出的上述解决方案更优雅,并且我可能没有想到?
如我所说,触发绑定更新
OnPropertyChanged
(这是我看到的类似问题-尽管不完全相同-提出的解决方案)在这种特殊情况下不是足够好的解决方案。PS:这不仅适用于文本框,而且适用于任何类型的编辑控件(日期选择器,范围选择器等)。这些控件可能是第三方的,我不一定能访问它们的源代码。
PS2:我正在使用.NET 4.5