Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我们会在RelayCommand中引用?_C#_Mvvm Light_Weak References - Fatal编程技术网

C# 为什么我们会在RelayCommand中引用?

C# 为什么我们会在RelayCommand中引用?,c#,mvvm-light,weak-references,C#,Mvvm Light,Weak References,我最近从MVVMLight 3升级到了4,并注意到我的命令中断了。事实证明,在新的RelayCommand(在版本3.5中实现)中使用弱引用导致我正在使用的代码构造失败。我知道有一些关于内存泄漏的弱引用的论点,我只是不理解 这失败了: private void InitCommand() { Command = new SwitchMainGridCommand<SwitchMainGridToolViewModel>(this).Command; } private vo

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

这失败了:

private void InitCommand()
{
    Command = new SwitchMainGridCommand<SwitchMainGridToolViewModel>(this).Command;
}
private void InitCommand()
{
Command=新的SwitchMainGridCommand(this).Command;
}
所谓失败,我的意思是,当我开始使用我初始化并绑定到的Command属性时,它的支持方法已被垃圾收集,并且命令无法执行。有趣的是,Command对象仍然存在,只是SwitchMainGridCommand上的支持属性现在消失了。在RelayCommand中的弱引用之前,ref to命令也保持支持属性可用,即使SwitchMainGridCommand没有被显式保留

这成功:

SwitchMainGridCommand<SwitchMainGridToolViewModel> _refHolder = null;

private void InitCommand()
{
    _refHolder = new SwitchMainGridCommand<SwitchMainGridToolViewModel>(this);
    Command = _refHolder.Command;
}
SwitchMainGridCommand\u refHolder=null;
私有void InitCommand()
{
_refHolder=新的SwitchMainGridCommand(此命令);
Command=\u refHolder.Command;
}
在分配命令的ViewModel上创建_refHolder类变量将保留收集_refHolder.Command引用的方法/属性


我猜这是弱引用所需要的行为,我只是不确定为什么需要它。

这里有一篇来自MSDN的关于弱引用与强引用的文章:
可能,我重复一遍,可能是因为这个原因:

在MvvmLight逻辑和其他mvvm样式中,ViewModel使用定位器“链接”到视图。 现在,当在您的xaml页面中向前移动到下一页时,上一页的Vm仍然处于活动状态,使用弱给命令可以轻松释放内存

第二种方法很简单,可以更好地控制对象的使用寿命,让定位器成为唯一保存Viewmodel引用的对象,因此唯一的定位器可以决定何时何地释放


我希望这能对你有所帮助,我想如果虚拟机还存在一段时间并不重要,主要是当你的软件没有使用非常大的内存时。Alloc和dealloc严重影响了软件的性能

SwitchMainGridCommand的代码是什么?它只是一个类,我在其中绑定了RelayCommand工厂属性及其执行方法和CanExecute委托参数点。感谢链接。在我看来,命令的生命周期完全在ViewModel的控制范围内,ViewModel创建命令并公开一个属性以绑定到命令,并且不容易在难以或不可能正确管理命令的情况下发生泄漏。我没有将此标记为答案,因为我仍然不清楚为什么引用RelayCommand内部的实现方法是有意义的。我认为这可能与使用EventToCommand将事件连接到命令有关,因为“弱事件模式”似乎有一个明确的使用场景。