我有一个复杂的后端流程,可以运行很长一段时间。所有重要的统计数据都会作为属性公开,并在设置时引发INotifyPropertyChanged
个事件。
我想添加一个“经过时间”,这比预期更具挑战性。
我公开了ProcessStartedAt
日期时间,并将转换器汇总在一起,以从DateTime.Now
中减去约束时间。这完美地工作(一次)。之后,由于属性没有改变,因此永远不会更新绑定,也不会再次调用转换器。
我不希望后端有一个专用于更新“Elapsed time”属性的计时器。它违反了关注分离原则。我对UI中的计时器感到满意,但我不确定如何强制绑定刷新而不更新属性值。
更好的是,有没有办法告诉绑定定期刷新?
<TextBlock Text="{Binding Path=ProcessStartedAt,
Converter={StaticResource ElapsedTime}}"/>
答案 0 :(得分:1)
我会在ValueConverter类中抛出计时器,并在每次触发间隔时引发一个事件来调用Convert方法。
这使得ValueConverter专注于自己的责任。
答案 1 :(得分:1)
不需要转换器,只需通知延迟getter:
public string RemainingTime
{
get {
Task.Delay(1000).
ContinueWith(w => OnPropertyChanged(() => RemainingTime));
return (CurrentServerTime - SelectedDeliveryTime).ToString("mm\\:ss");
}
}
由于OnPropertyChange
,将调用绑定答案 2 :(得分:0)
&#39;我有一个复杂的后端流程,可以运行很长一段时间。&#39;并且我不希望后端有一个专门用于更新&#34;经过时间的计时器&#34; 。酒店的#&39;似乎有点适得其反。
尝试不使用视图模型更新视图似乎违反了某些MVC原则。假设您找到了一种方法,下面的工程师/开发人员可能不这样做。
也许您应该找到一种方法及时更改视图模型课程,而不是试图阻止&#39;及时更新。通过这种方式,您不必担心事情的更新方式。相反,你会申请&#39;以易于理解,未来更改以及更新应用框架时更新技术的方式更改视图模型。
修改强>
我想唯一的方法是设置DispatcherTimer,订阅它并调用OnPropertyChanged。与您的问题无关,但如果需要,您也可以在您的绑定中添加延迟。