首页 文章

使用带有Prism / Unity的Silverlight MVVM,需要检测何时关闭视图

提问于
浏览
4

我正在使用MVVM(Model-View-ViewModel)模式编写应用程序,并利用Microsoft P&P团队的Prism和Unity位 .

我有一个包含项目列表的视图 . 这些项包含在ViewModel中的ObservableCollection中,View中的列表框是数据绑定的(ViewModel设置为View的DataContext) . 在ViewModel中,我有一个运行的计时器,每30秒触发一次服务器轮询以获取新数据 . 当数据返回时,我将其封送到UI线程并将新数据添加到ObservableCollection . 一切都很好 .

我遇到的问题是我需要在视图关闭时停止计时器 . 我不确定在这里要注意什么事件 . Unity中有什么东西会告诉我该区域的视图何时被替换?是否有一个最适合从视图中使用的事件,并且可能将该事件(或外观)传递给ModelView?根据P&P示例,我的视图是一个UserControl . 我找不到“Unload”事件,也没有覆盖的方法 .

我已经在考虑编写自己的服务来处理视图更改(RegionManager的某种外观),并且可能只是在我的Views上实现一个公共接口来进行清理,或者在从视图中删除它们时实现IDisposable . 但是,如果使用核心Silverlight框架或Unity / Prism的范围有一个干净的方法,我宁愿采取这种方式 .

Edit - Answer:

我最后选择了一个与我正在为我的解决方案做的最接近的答案来标记Anderson Imes的答案 . 但实际上,我正在使用来自PL和GraemeF的部件,并且每个人都投票 . 这对我来说是一个很好的回应,因为它让我对这些区域有了更好的了解,给了我另一个框架来查看,并验证我可能正在通过实现服务来处理视图更改而不仅仅是调用进入RegionManager .

3 回答

  • 3

    我有这个确切的问题,最终基本上为此创建了一个接口:

    public IApplicationEvents
    {
         void OnClose();
    }
    

    我集中了我的关闭视图代码,基本上只是在删除视图之前查找此接口 . 如果它在那里,我可以调用它(我检查了View本身以及DataContext属性,如果它是UIElement) .

    我使用附加属性和EventAggregator对它进行了一些改进,但这是基本的想法并且运行良好 .

    当您查看关闭时,您需要关闭它,特别是如果您正在使用DispatcherTimer(如您所愿) . 如果不这样做,这会导致一些非常糟糕的内存泄漏 .

  • 1

    我认为您正在寻找的是来自Region Manager框架的IActiveAware接口(请参阅RegionActiveAwareBehavior):

    RegionActiveAwareBehavior负责通知视图是活动还是非活动 . 视图必须实现IActiveAware才能接收这些更改通知 . 此活动感知通知是视图的单向通知;通过更改IActiveAware接口上的活动属性,视图不会影响其活动状态 .

  • 2

    Caliburn用它的IPresenter Component Model来解决这个缺失的棱镜,并与Prism配合得很好 . 您将在ViewModel上实现 IPresenter 接口(或更可能使用其中一个基类),并在 OnShutdown 和/或 OnDeactivate 中停止计时器 .

    您可以自己使用Caliburn,也可以查看它是如何实现的 .

相关问题