MVVM Light框架Messenger.Default.Unregister 注销消息

MVVMLight 框架中有用到Messenger.Default.Register 来注册消息,因此必须要有Messenger.Default.Unregister 来注销消息,否则可能会发生内存错误。那么他们分别放在哪呢?以下简洁的描述下:

消息的注册或注销 一般在Silverlight会有三个地方可能出现,分别是ViewModel、Windows或者是ChildWindows。那我就分别按照这三个地方来讲下:

1、ViewModel

 public ManageWindowViewModel() {
            if (!IsInDesignMode) {

         CloseWindowCommand = new RelayCommand(CloseWindow);

              Messenger.Default.Register<ChildWindowMessage<CategoryWindowViewModel>>(this, "CloseCategoryWin",FunctionWindowCallback); //注册一个消息
} }
private void FunctionWindowCallback(ChildWindowMessage<CategoryWindowViewModel> vm) {
//...你的代码
}

关键的来了:我们要在此页面关闭的时候把这个消息注销掉。

我们可以在页面关闭的时候把他注销掉。

private void CloseWindow() {
            Messenger.Default.Unregister(this);//这就注销掉了
       //...关闭页面的代码
}

但是这个时候有个变态的事情发生了,如果我们的这个ViewModel是ChildWindow的话,那用户可能不是通过我们的按钮事件关闭窗口,而是点击子页面的右上角的x(如图1)来关闭的话就麻烦了,这时我们也来个变态的招。我们就把这个给去掉,逼着用户通过按钮关闭。其实很简单,只需要在子窗口的.xaml中的<controls:ChildWindow 中加上一句HasCloseButton="False" 就可以了。当然这个只是对子窗口有效。

 

2、Windows的.cs页面中注册的

这个其实很简单。只需要在页面中加上即可,他会在离开页面时注销消息的

protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
{
Messenger.Default.Unregister(this);
ViewModel = null;//根据自己需要
}

3、ChildWindows的.cs页面中注册的  有我软件   www.ywrj.net

这个稍微复杂点,但其实也还是蛮简单的。类似于第一种情况。

我们关闭页面时加上即可。具体方法参照一即可,也是要防止用户从x上关闭。把x禁止掉

private void Close(ChildWindowMessage<CategoryWindowViewModel> message) {

 

Messenger.Default.Unregister(this);

this.DialogResult = message.DialogResult;
}

转自:http://www.ywrj.net/a/NET/SL_WPF/20120517/10996.html

posted on 2012-05-17 00:25  俄罗斯水手  阅读(2203)  评论(0)    收藏  举报

导航