c# – ViewModel每秒更新一次?
我写了一个应用程序,显示用户在课程上剩余时间的列表.
我希望列表每秒动态更新,以便用户具有完整的概述. 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); } } 正如您在上面所看到的,这个想法是模型知道客户何时进入电路以及何时离开. 不过这是我的担心.在每个viewmodel上添加一个Timer似乎非常臃肿,这真的是实现这个目标的最好方法吗? 谢谢. 是的,我正在考虑使用计时器服务以防止有多个计时器,但是必须手动取消注册肯定会在某些时候引入备忘录泄漏. 所以Weak Events的想法很棒. 我想这样做: 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; } } 你有什么意见吗 ? 我使用了Daniel Grunwald在codeproject上编写的WeakEvent实现. (它提供了一个非常干净的类,并没有太多的开销). 解决方法
您可以使用具有私有计时器和公共事件的计时器服务,该服务每秒通知所有视图模型.
关于内存问题,您可以在导航页面时使用计时器服务注册viewmodel( (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |