ViewModel每秒更新一次?

Mor*_*idt 7 c# wpf mvvm

我正在编写一个应用程序,显示用户在课程上剩余时间的列表.我希望列表每秒动态更新,以便用户拥有完整的概述.

public class ReservationCustomerList : INotifyPropertyChanged
{
    public int UnitsLeft  { get; set; }
    public DateTime? OnCircuitSince { get; set; }
    public TimeSpan? TimeLeftDate
    {
        get
        {
            if (OnCircuitSince.HasValue)
                return TimeSpan.FromSeconds((OnCircuitSince.Value - DateTime.Now).TotalSeconds - UnitsLeft);
            return TimeSpan.FromSeconds(UnitsLeft);
        }
    }
    private void FireEverySecond()
    {
        PropertyChanged.Fire(this, x => x.TimeLeftDate);
    }
}
Run Code Online (Sandbox Code Playgroud)

正如您在上面所看到的,这个想法是模型知道客户何时进入电路以及剩下的时间.正如你可以看到iam想要使用INotifyPropertyChanged接口然后在每个viewmodel上实际拥有一个计时器.

不过这是我关注的问题.在每个viewmodel上添加一个Timer似乎非常臃肿,这真的是实现这个目标的最好方法吗?第二个问题是,如果定时器永远不会停止,这不会导致内存泄漏,因为定时器永远不会停止并保持视图模型的活动状态?如果是这种情况,我的Viewmodel也需要实现IDisposable,我需要记住运行所有viewmodel并处理它们以确保这些是垃圾回收.我的担忧是否正确?


谢谢.

是的,我想有一个计时器服务,以防止有多个计时器,但不得不手动取消注册肯定会在某些时候引入备忘录泄漏.

所以弱事件的想法很棒.

我想这样做:

public class TimerService
{
    static Timer Timer;
    static FastSmartWeakEvent<EventHandler> _secondEvent = new FastSmartWeakEvent<EventHandler>();
    static FastSmartWeakEvent<EventHandler> _minuteEvent = new FastSmartWeakEvent<EventHandler>();
    static DateTime LastTime;
    public static event EventHandler SecondEvent
    {
        add { _secondEvent.Add(value); }
        remove { _secondEvent.Remove(value); }
    }
    public static event EventHandler MinuteEvent
    {
        add { _minuteEvent.Add(value); }
        remove { _minuteEvent.Remove(value); }
    }
    static TimerService()
    {
        Timer = new Timer(TimerFire, null, 1000, 1000);
    }
    static void TimerFire(object state)
    {
        _secondEvent.Raise(null, EventArgs.Empty);
        if (LastTime.Minute != DateTime.Now.Minute)
            _minuteEvent.Raise(null, EventArgs.Empty);
        LastTime = DateTime.Now;
    }
}
Run Code Online (Sandbox Code Playgroud)

你有什么意见吗 ?我知道我可以使用单例GetInstance(或IoC),但这会使它更加不方便使用.

我使用Daniel Grunwald在codeproject上编写的WeakEvent实现.(它提供了一个非常干净的类,并没有太多的开销). http://www.codeproject.com/KB/cs/WeakEvents.aspx

alf*_*alf 7

您可以使用具有私有计时器和公共事件的计时器服务,该服务每秒通知所有视图模型.

关于内存问题,您可以在页面导航(OnNavigatedTo)时使用计时器服务注册viewmodel,并在视图关闭时取消注册(OnNavigatedFrom).这样,当视图模型超出范围时,视图模型就不会对计时器服务进行任何引用,并且它们将被正确地进行垃圾收集.

  • 要支持此模型,请查看[关于弱事件模式的MSDN文章](http://msdn.microsoft.com/en-us/library/aa970850.aspx) (4认同)
  • 您还可以使用Prism框架中的EventAggregator:http://msdn.microsoft.com/en-us/library/ff921122(v = pandp.20).aspx (4认同)