1

试图追踪我们的 WPF/MVVM 应用程序中的一些内存泄漏,我发生了一些事情......

如果您使用特定于实例的处理程序在其关联的 ViewModel 中侦听 ModelItem 事件,那么只要 ModelItem 仍然存在,这是否会使 ViewModel 挂起?

考虑这种情况...

public class ItemViewModel
{
    public ItemViewModel(ModelItem item)
    {
        this.Item = item;
        item.SomeEvent += ItemSomeEventHandler
    }

    Public ModelItem Item { get; private set; }

    // Note: This is a handler on this instance, not a shared handler
    private void ItemSomeEventHandler(object s, EventArgs e)
    {
        Console.WriteLine(“The model changed!”);
    }
}

如果这确实导致泄漏,您如何/在哪里解开它?您不能在“Dispose”中执行此操作,因为如果某些内容仍然具有对它的引用,则不会调用它,看起来确实如此:模型项。

合适的地方是在使用这个 ViewModel 的控件中实现 Dispose,然后在那里滴下一个事件取消挂钩例程吗?依靠外部的东西来确保你清理你自己的内部似乎有点危险,但是没有去一个 EventManager 架构,我不知道在这里做什么。

4

2 回答 2

2

为什么不使用Wea​​kEvent / DelegateCommands

它们实现了对不需要确定性分离的委托的弱引用。

于 2012-05-07T06:39:15.613 回答
1

是的,它会导致泄漏..或者更具体地说,ItemViewModel当不再显示视图时将不会收集,因为ModelItem持有对ItemViewModel

如果您可以Dispose控制ViewModel. 问题是什么组件正在创建ItemViewModel?如果它是另一个视图模型,那么您可以将处置委托给该视图模型,或者如果视图创建了视图模型,那么您可以调用该Dispose方法。

但是,如果您像MVVMLight工具包一样使用,那么您可以使用它的ICleanup界面或类似的东西。查看其他答案以获取更多信息。

于 2012-05-07T04:40:47.103 回答