Wpf绑定定期更新
本文关键字:定期更新 绑定 Wpf | 更新日期: 2023-09-27 18:30:08
我有一个运行很长时间的复杂后端进程。所有重要统计信息都作为属性公开,并且在设置时引发INotifyPropertyChanged
事件。
我想添加一个"流逝的时间",事实证明它比预期的更具挑战性。
我公开了一个ProcessStartedAt
DateTime,并组合了一个转换器来从DateTime.Now
中减去绑定时间。这很好用(一次)。之后,由于属性没有更改,绑定永远不会更新,转换器也不会再次调用。
我不希望后端有一个专门用于更新"运行时间"属性的计时器。这违反了关注点分离原则。如果UI中有计时器,我会更高兴,但不确定如何在不更新属性值的情况下强制刷新绑定。
更好的是,有没有一种方法可以告诉绑定定期刷新?
<TextBlock Text="{Binding Path=ProcessStartedAt,
Converter={StaticResource ElapsedTime}}"/>
不需要转换器,只需在getter:上通知延迟即可
public string RemainingTime
{
get {
Task.Delay(1000).
ContinueWith(w => OnPropertyChanged(() => RemainingTime));
return (CurrentServerTime - SelectedDeliveryTime).ToString("mm'':ss");
}
}
由于OnPropertyChange
我会在ValueConverter类中抛出计时器,并在每次达到间隔时引发一个事件来调用Convert方法。
这使ValueConverter专注于其职责。
"我有一个运行很长时间的复杂后端流程。"以及"我不希望后端有一个专门用于更新"运行时间"属性的计时器。"似乎有点适得其反。
试图不使用视图模型更新视图似乎违反了一些MVC原则。假设您找到了这样做的方法,下面的工程师/开发人员可能不会。
也许您应该找到一种方法来及时更改视图模型类,而不是试图及时"阻止"更新。这样你就不必担心事情是如何更新的。相反,您将以一种易于理解的方式将更改"应用"到视图模型,在未来进行更改,并能够在应用更新do框架时更新技术。
编辑
我想唯一的方法是设置一个DispatcherTimer,订阅它并调用OnPropertyChanged。与您的问题无关,但如果需要,您也可以对绑定设置延迟。