Wpf绑定定期更新

本文关键字:定期更新 绑定 Wpf | 更新日期: 2023-09-27 18:30:08

我有一个运行很长时间的复杂后端进程。所有重要统计信息都作为属性公开,并且在设置时引发INotifyPropertyChanged事件。

我想添加一个"流逝的时间",事实证明它比预期的更具挑战性。

我公开了一个ProcessStartedAt DateTime,并组合了一个转换器来从DateTime.Now中减去绑定时间。这很好用(一次)。之后,由于属性没有更改,绑定永远不会更新,转换器也不会再次调用。

我不希望后端有一个专门用于更新"运行时间"属性的计时器。这违反了关注点分离原则。如果UI中有计时器,我会更高兴,但不确定如何在不更新属性值的情况下强制刷新绑定。

更好的是,有没有一种方法可以告诉绑定定期刷新?

<TextBlock Text="{Binding Path=ProcessStartedAt,
                          Converter={StaticResource ElapsedTime}}"/>

Wpf绑定定期更新

不需要转换器,只需在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。与您的问题无关,但如果需要,您也可以对绑定设置延迟。