我正在使用MVVM(Model-View-ViewModel)模式编写应用程序,并利用Microsoft P& P团队的Prism和Unity位。
我有一个包含项目列表的视图。这些项包含在ViewModel中的ObservableCollection中,View中的列表框是数据绑定的(ViewModel设置为View的DataContext)。在ViewModel中,我有一个运行的计时器,每30秒触发一次服务器轮询以获取新数据。当数据返回时,我将其封送到UI线程并将新数据添加到ObservableCollection。一切都很好。
我遇到的问题是我需要在视图关闭时停止计时器。我不确定在这里要注意什么事件。 Unity中有什么东西会告诉我该区域的视图何时被替换?是否有一个最适合从视图中使用的事件,并且可能将该事件(或外观)传递给ModelView?根据P& P示例,我的视图是一个UserControl。我找不到“卸载”事件,也没有覆盖的方法。
我已经在考虑编写自己的服务来处理视图更改(RegionManager的某种外观),并且可能只是在我的Views上实现一个公共接口来进行清理,或者当它们从一个中移除时实现IDisposable视图。但是,如果在Corelight框架核心或Unity / Prism的范围内有一种干净的方式,我宁愿采取这种方式。
编辑 - 答案:
我最终选择了一个最接近我正在为我的解决方案做的那个来标记Anderson Imes的答案。但实际上,我正在使用来自PL和GraemeF的部件,并且每个人都投票。这对我来说是一个很好的回应,因为它让我对这些区域有了更好的了解,给了我另一个框架来查看,并验证我可能正在通过实现服务来处理视图更改而不仅仅是调用进入RegionManager。
答案 0 :(得分:3)
我认为您正在寻找的是来自Region Manager框架的IActiveAware接口(参见 RegionActiveAwareBehavior):
RegionActiveAwareBehavior 负责通知视图是处于活动状态还是非活动状态。该视图必须实施 IActiveAware 才能接收这些更改通知。此活动感知通知是视图的单向通知;通过更改 IActiveAware 界面上的活动属性,视图不会影响其活动状态。
答案 1 :(得分:2)
Caliburn用IPresenter Component Model解决了这个缺失的Prism片,并与Prism配合得很好。您将在ViewModel上实现IPresenter
接口(或更可能使用其中一个基类),并在OnShutdown
和/或OnDeactivate
中停止计时器。
您可以自己使用Caliburn,也可以查看它是如何实现的。
答案 2 :(得分:1)
我遇到了这个问题,最终基本上为此创建了一个界面:
public IApplicationEvents
{
void OnClose();
}
我集中了我的关闭视图代码,基本上只是在删除视图之前查找此接口。如果它在那里,我可以调用它(我检查了View本身以及DataContext属性,如果它是UIElement)。
我使用附加属性和EventAggregator对它进行了一些保护,但这是基本的想法并且效果很好。
当你查看关闭时,你需要关闭它,特别是如果你正在使用DispatcherTimer(你应该)。如果不这样做,这会导致一些非常糟糕的内存泄漏。