为什么RelayCommand中的WeakReferences?

时间:2013-01-07 19:07:40

标签: c# mvvm-light weak-references

我最近从MVVMLight 3升级到4,并注意到我的命令崩溃了。事实证明,在新的RelayCommand(在3.5版中实现)中使用弱引用导致我使用的代码构造失败。我知道有一些关于内存泄漏的弱参考的论据,我只是不明白。

这失败了:

private void InitCommand()
{
    Command = new SwitchMainGridCommand<SwitchMainGridToolViewModel>(this).Command;
}

失败了,我的意思是当我去使用我初始化和绑定的Command属性时,它的后备方法已被垃圾收集并且Command无法执行。有趣的是,Command对象仍然存在,只是SwitchMainGridCommand上的支持属性现在消失了。在RelayCommand中的弱引用之前,尽管未明确保留SwitchMainGridCommand,但引用Command仍然保持支持属性可用。

这成功了:

SwitchMainGridCommand<SwitchMainGridToolViewModel> _refHolder = null;

private void InitCommand()
{
    _refHolder = new SwitchMainGridCommand<SwitchMainGridToolViewModel>(this);
    Command = _refHolder.Command;
}

在正在分配Command的ViewModel上创建_refHolder类变量将保留引用_refHolder.Command的方法/属性。

我想这是弱参考的理想行为,我只是不确定为什么需要它。

2 个答案:

答案 0 :(得分:1)

以下是来自MSDN的关于弱引用和强引用的文章: MSDN Goodness

答案 1 :(得分:0)

也许,我可能因为这个原因重复:

在MvvmLight逻辑和其他mvvm样式中,ViewModel使用Locator“链接”到视图。 现在当你的xaml页面向前移动到下一页上一页的Vm仍然存在时,使用命令weak可以轻松释放内存。

第二个很简单,可以更好地控制对象的生命,让定位器唯一能够保存Viewmodel的引用因此唯一可以决定何时何地释放

我希望这可能会对你有所帮助,如果一个vm仍然存在一段时间并不是真的很重要,我主要是当你的软件没有使用真正巨大的内存时。 Alloc和dealloc影响了软件的性能