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;
}
浙公网安备 33010602011771号