数据绑定落后于事件通知 - 讨论

cod*_*ter 5 data-binding silverlight wpf events mvvm

发现了一个我在WinForms中首次发现的有趣问题,并且在Silverlight中再次找到了问题,而且在数据绑定方面也是如此.

我有一个带有几个标签的标签控件.当用户单击选项卡时,每次都应该有效,然后允许用户从选项卡切换.

例如,用户位于更新的文本框中.在控件失去焦点之前,不会刷新文本框的绑定.当光标从控件移开时发生焦点丢失,并且焦点被给予另一个控件.

在这种情况下,用户选中控件(让我们使用此示例的文本框),并更新文本框.此时数据绑定尚未刷新控件,因此VM尚未看到更改.然后,用户使用鼠标单击控件的下一个选项卡.

在这一点上,事情变得有趣.我使用了PreviewSelectionChanged(Telerik RadTabControl),因为我想在跳转到下一个标签之前检查一下,它还让我能够取消事件.

但是,当我查看VM时,在这种情况下,它仍然没有更新的数据.我看到虚拟机很干净,然后继续跳转到下一个选项卡.

但是,只要此事件结束,数据绑定就会刷新,并且VM会更新.现在怎么办?事件不同步!当鼠标用于单击下一个选项卡时,文本框应该丢失焦点,刷新它的绑定,然后单击选项卡的预览!跳回去说哎呀我们没赶上时间!

我想我发现了一个有趣的工作 - 但我并不是百分之百确定它会在100%的时间内发挥作用.我取消当前事件,但后来我使用Dispatcher并创建一个委托指向另一个方法,该方法具有与当前事件相同的签名.Dispatcher会将此消息添加到消息泵,此时此时(希望?)将在VM更新的消息后面...

代码片段延迟事件

我的两个问题是:1)我假设当鼠标离开控件时文本框控件没有刷新,或者被触发的进程太慢,因此在数据绑定之前预览消息在泵上 - 或者我认为这是一个重大问题.

2)变通方法是一个很好的解决方案吗?

ben*_*rce 0

更改您的绑定以包含 UpdateSourceTrigger="PropertyChanged"。

这将确保您的数据源在每次击键时都会更新,而不仅仅是 LostFocus。