Wpf绑定定期更新

时间:2014-11-11 13:26:38

标签: c# wpf data-binding

我有一个复杂的后端流程,可以运行很长一段时间。所有重要的统计数据都会作为属性公开,并在设置时引发INotifyPropertyChanged个事件。

我想添加一个“经过时间”,这比预期更具挑战性。

我公开了ProcessStartedAt日期时间,并将转换器汇总在一起,以从DateTime.Now中减去约束时间。这完美地工作(一次)。之后,由于属性没有改变,因此永远不会更新绑定,也不会再次调用转换器。

我不希望后端有一个专用于更新“Elapsed time”属性的计时器。它违反了关注分离原则。我对UI中的计时器感到满意,但我不确定如何强制绑定刷新而不更新属性值。

更好的是,有没有办法告诉绑定定期刷新?

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

3 个答案:

答案 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。与您的问题无关,但如果需要,您也可以在您的绑定中添加延迟。