1

我有一个简单的 ViewModel

    public class TestViewModel : ViewModelBase, IDisposable
    {

    public TestViewModel()
    {
        Messenger.Default.Register<string>(this, MessageHandling);
    }

    public void MessageHandling(string message)
    {
        System.Windows.MessageBox.Show(message);
    }
    public override void Cleanup()
    {
        Messenger.Default.Unregister(this);
        base.Cleanup();
    }
    }

我像这样在我的 XAML 中使用它:

   <Window.Resources>
    <ResourceDictionary>
        <vm:TestViewModel x:Key="ViewModel"></vm:TestViewModel>
    </ResourceDictionary>
   </Window.Resources>
   <Grid DataContext="{Binding Source={StaticResource ViewModel}}">
   </Grid>

任何人都可以帮助我们处理这个 ViewModel,通过处理我的意思是我应该订阅哪个事件来调用 VM 方法清理?因为如果我不进行清理,ViewModel 将保留在内存中并仍然处理消息。我希望我解释得当:)

提前致谢

4

2 回答 2

2

首先,它取决于您何时要处理它。你没有说清楚。我首先以为您的意思是“当应用程序关闭时”,然后我会使用退出事件。但我被你的说法激怒了

因为如果我不进行清理,ViewModel 将保留在内存中并仍然处理消息。我希望我解释得当

只有当您想要处理但您的应用程序仍需要运行时才会发生这种情况。如果您的应用程序关闭,则内存中没有任何内容,也不再处理任何消息。但不依赖它仍然是一个好习惯。

因此,如果您的意思是“当应用程序关闭时”,这就是您的答案。

于 2012-08-04T10:26:25.020 回答
0

有一个解释为什么即使您执行取消注册,Messenger 仍然会引起强引用,以及解决方法。

当 Unloaded 发生时,您的 FrameworkElement(“View”)可以在 ViewModel 中调用 Cleanup:

于 2012-08-04T11:26:39.913 回答