【问题标题】:Disposing of static resource ViewModels [closed]处理静态资源 ViewModels [关闭]
【发布时间】:2012-08-04 10:19:13
【问题描述】:

我有一个简单的 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 将保留在内存中并仍然处理消息。 我希望我解释得当:)

提前致谢

【问题讨论】:

  • 您使用的是MVVM Light Toolkit,对吗?
  • @Paul Michalik 正确,但如果这是您的下一个问题,我不会使用 ViewModelLocator :)

标签: wpf mvvm mvvm-light


【解决方案1】:

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

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

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

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

【讨论】:

  • 好吧,我担心我没有很好地解释我的需求。例如。这个窗口是我的应用程序中的一些窗口/控件,我打开/使用它使用VM做一些工作,然后我关闭这个窗口并打开另一个用于其他目的但具有相同的viewmodel类(不同的实例)但我的VM仍然存在因为 Messenger 类有对它的引用来接收消息。我想要/需要的是一个事件,当我的窗口/控件不再使用来调用我的 VM 的 Cleanup 方法时。注意卸载事件不好(使用标签和切换原因清理)
  • 如果它是一个窗口,您可以使用Closed 事件。
  • 是的,窗口很好,控件呢?
  • 那么您只能选择使用 Loaded 和 Unloaded,但这可能会被多次调用,并不能清楚地表明控件已“关闭”,但仅此而已。
  • @dowhilefor 您假设所有内容都已由 GC 管理并为您清理,并且正在发生应用程序关闭。如果在这种情况下您实际上必须手动清理某些东西怎么办?如果使用 ElementHost 时没有 WPF 窗口怎么办?
【解决方案2】:

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

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

【讨论】:

  • 是的,我已经读过了,这很好,我想要找到的是何时在我的视图模型上调用 Cleanup
  • 谢谢,但我已经尝试过这种方法 Unloaded 事件,它适用于大多数情况,但我需要另一个因为 Unloaded 事件发生在从可视树中删除窗口/控件时发生但不一定关闭。示例是选项卡控件,在选项卡之间切换会导致 Unload 事件,并且我的 VM 从消息中注销,但这不是我想要的行为,因为我希望 VM 仍然附加到消息,直到我处理掉我的控件。我设法解释了我的问题吗?
  • 您可以通过使用不同的 TabControl 来阻止仅切换选项卡时的卸载行为。 codeproject.com/Articles/212233/… 和其他解决方法stackoverflow.com/questions/2238072/…
  • @colinsith 感谢您的帮助,它并没有直接解决我的问题,而是让我知道如何解决我的问题,再次感谢
  • @Miran 你想分享你的解决方案吗?
猜你喜欢
  • 2011-03-29
  • 2012-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-04
  • 2012-07-06
  • 2013-08-01
  • 2014-08-29
相关资源
最近更新 更多