前一段时间,我写了一个小部件应用程序,该应用程序应该跟踪任务,每个任务都有一个作为DateTime指定的最后期限,现在如果你想显示剩下多少时间,直到你可能要绑定的截止日期一个“虚拟”(*诅咒虚拟关键字*)属性,如下所示:
public TimeSpan TimeLeft { get { return Deadline - DateTime.Now; } }
显然,在理论上,这个属性会改变每个刻度,并且你想要每时每刻更新你的UI(例如,通过定期抽出一个PropertyChanged事件为该属性).
返回当我写的小部件我每分钟刷新整个任务列表,但这是不太理想的,因为如果用户与一些项目交互(例如,通过键入一个TextBox绑定到一个注释属性),将被严格的中断和更新来源丢失.
那么如果您有这样的时间依赖属性,那么更新UI的最佳方法可能是什么?
(我不用那个应用程序了,只是以为这是一个非常有趣的问题)
我想你在代码示例之后的第一段中说的是WPF中唯一合理的方法.设置一个只需调用PropertyChanged作为TimeLeft属性的计时器.间隔将根据您的情况而有所不同(如果您正在谈论每周任务列表,则可能只需要5分钟更新)如果您在接下来的30分钟内谈论任务列表,则可能需要每分钟或30秒更新一次.
该方法将避免您使用refresh选项提到的问题,因为只有TimeLeft绑定会受到影响.如果你有这么多的这些任务,我猜这个性能的惩罚将是非常重要的.但是,如果你只有几十个或几个东西,每30秒钟更新一次绑定将是一个非常微不足道的问题,对吧?
我可以想到的每一种可能性都使用定时器或动画.当您将任务添加到列表中时,动画将变得太“沉重”了.而在Timer方案中,上面的一个似乎是最干净,最简单和最实用的.可能只是归结为是否适用于您的具体情况.