【发布时间】:2011-05-25 11:49:37
【问题描述】:
前段时间我写了一个类似小部件的应用程序,它应该跟踪任务,每个任务都有一个指定为DateTime的截止日期,现在如果你想显示距离截止日期还有多少时间你可能想要绑定到“虚拟”(*诅咒virtual关键字*)属性,如下所示:
public TimeSpan TimeLeft
{
get { return Deadline - DateTime.Now; }
}
从理论上讲,这个属性显然会在每一次滴答声中发生变化,并且您希望时不时地更新您的 UI(例如,通过定期为该属性抽出 PropertyChanged 事件)。
当我编写小部件时,我每分钟刷新整个任务列表,但这并不理想,因为如果用户与某些项目交互(例如,通过键入绑定到 Comments-property 的 TextBox),这将被严重中断并且源更新丢失。
如果您有这样的时间相关属性,那么更新 UI 的最佳方法是什么?
(顺便说一句,我不再使用那个应用程序了,只是觉得这是一个非常有趣的问题)
【问题讨论】:
-
你比我更了解这些东西,所以我很好奇 - 除了 DP 和 INPC 之外,还有哪些事件或动作导致绑定系统重新评估当前 UI 中的所有绑定?有吗?如果是这样,是否可以依赖其中任何一个可靠地发生?
-
@Tim:想不到任何,好吧,当 DataContext 更改时,由于继承而导致子树中的更新(对于绑定到它的绑定)。在 WPF 中,您可以公开访问关联的
DataContextChanged事件。由于某种原因,在 Silverlight 中它是内部的。 -
作为 WPF 设计要求,所有属性都具有 setter 并且 getter 始终返回设置值可能值得说明。否则说像上面这样的功能代表 GUI 本质上是一个谎言。
-
@DaxFohl:我认为这不是一个好主意,您需要为可以即时检索的内容引入冗余的支持字段。此外,该属性也会对其内容撒谎,因为它不能准确,因为它只能经常刷新。
-
您的问题是一般性和基本性的。时间是连续的。 UI 更新是严格离散的。因此,您需要从离散点的连续数据源更新您的 UI。因此,抽水是不可避免的。您可以使用计时器(您也可以订阅
CompositionTarget.Rendering事件,但我认为不需要)我正在制作一个允许此类绑定(以及其他东西)的库,但您的情况是简单,不会从中受益。
标签: wpf data-binding time dependencies notifications