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

wpf – 数据绑定落后于事件通知 – 讨论,第1张

概述发现了一个我在WinForms中首次发现的有趣问题,并且在Silverlight中再次找到了问题,而且在数据绑定方面也是如此. 我有一个带有几个标签的标签控件.当用户单击选项卡时,每次都应该有效,然后允许用户从选项卡切换. 例如,用户位于更新的文本框中.在控件失去焦点之前,不会刷新文本框的绑定.当光标从控件移开时发生焦点丢失,并且焦点被给予另一个控件. 在这种情况下,用户选中控件(让我们使用此示例 发现了一个我在WinForms中首次发现的有趣问题,并且在Silverlight中再次找到了问题,而且在数据绑定方面也是如此.

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

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

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

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

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

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

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

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

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

解决方法 好的,首先回答问题1:

仅仅因为鼠标离开了文本框区域,并不意味着文本框失去了焦点.一旦其他东西得到关注,它就会失去焦点.例如,如果您将鼠标移出文本框并单击页面上的其他控件(它可以是从滚动查看器到另一个文本框等的任何内容),那么您的文本框将失去焦点.

现在,基于此,事件不会以错误的顺序发生.会发生什么;你在另一个标签上的点击事件触发文本框失去焦点(并发生数据绑定)和移动到下一帧,并基于此,你基本上得到一个竞争条件,其中移动到下一个选项卡发生在数据绑定发生之前.

关于问题2:

你可以做的是,将UpdateSourceTrigger设置为Explicit,然后你将被迫拥有某种text_changed事件并手动更新绑定.

您可以阅读有关该here的更多信息.这可能不是最完整的解释,但它是一个很好的起点.

另一方面,您可以将某些事件与文本框关联,并强制文本框失去对这些事件的关注(例如鼠标移出).

总结

以上是内存溢出为你收集整理的wpf – 数据绑定落后于事件通知 – 讨论全部内容,希望文章能够帮你解决wpf – 数据绑定落后于事件通知 – 讨论所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1209334.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存