【发布时间】:2011-09-26 20:06:40
【问题描述】:
对于冗长的解释,我深表歉意。
我正在开发 WPF 桌面应用程序(如下所示):
列表中基本上可以有 0..n 个进程状态项(这些项本身是使用 DataTemplate 呈现的 ListBoxItems)。最近,我决定要提供“经过时间”样式的演示文稿(n 秒/分钟/小时前),以替代绝对日期时间格式(mm/dd/yyyy at HH:mm:ss)。我已经通过对 TextBlock 使用 MultiBinding 来实现这一点:
<TextBlock>
<TextBlock.Text>
<MultiBinding Converter = "{StaticResource timeElapsedConverter}">
<Binding
Path = "StatusDateTime"
/>
<Binding
Source = "{StaticResource propertiesHelper}"
Path = "UserOptions.UseElapsedTimeStamps"
/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
我不会详细介绍 IMultiValueConverter 实现的细节。第二个绑定是到一个帮助类,它获取用户的时间戳显示首选项(即,如果他们愿意,他们仍然可以看到绝对的 DateTime 值)。此 TextBlock 绑定到的“StatusDateTime”属性没有什么特别之处;它只是 ViewModel 类中的一个 POCO 属性,在设置时会触发 OnPropertyChanged。
此视图每 (x) 秒与系统后端同步一次。我想在同步期间“脉冲”时间戳,以便经过时间测量保持准确,但如果我只是将 StatusDateTime 属性设置为其现有值,似乎什么都没有发生(在下面的示例中,它只会说“Published 6 seconds ago...”,直到进程本身在服务器端更新或应用程序再次加载)。
我尝试按照this post 中的建议将 IsAsync="true" 添加到 StatusDateTime 绑定,但无济于事。
我还尝试使用 Mode="TwoWay" 显式声明的常规绑定(非多重),但这也不起作用。
我知道我可以在同步期间删除列表并重新创建,但是当我已经将所有需要的数据加载到客户端时,这似乎不太优雅。
更新:我尝试在窗口中重新创建这个基本设置,它似乎工作得很好。我现在想知道这是否与目标控件位于页面或 DataTemplate 的一部分有关。
有什么想法吗?提前致谢!
【问题讨论】:
-
你说你解雇了 OnPropertyChanged。验证您正在触发 NotifyPropertyChanged("StatusDateTime");不能想当然。
-
所以你将 DateTime 变量与 DateTime.Now() 进行比较并显示结果 TimeSpan?
-
@BahriGungor - 我验证了 StatusDateTime 字段的 PropertyChanged 事件正在触发。
-
@Baboon - 不,我正在绑定到我的 ViewModel 类中的 StatusDateTime 属性,并且希望所述绑定会在基础属性值更新时导致 UI 更新。