我很难使用GalaSoft.MvvmLight.RelayCommand。一切正常,直到我尝试访问闭包。我没有收到任何错误或日志输出。
本准则正在运作:
for (int i = 0; i < 3; i++)
{
var iTemp = i;
var command = new RelayCommand(() =>
{
Debug.WriteLine("executed");
Debug.WriteLine(this);
// Debug.WriteLine(iTemp);
});
Commands[i.ToString()] = command;
children.Add(dataTemplateCreator.BuildButtonWithCommand(0, gridRow, $"Commands[{i}]", i.ToString()));
gridRow++;
}
一旦我删除了注释,命令就不再执行了。 有没有人见过这种行为?
我也尝试了一个更简单的
使用:
Execute = new RelayCommand(() =>
{
Value += 3;
});
停止工作:
var incValue = 3;
Execute = new RelayCommand(() =>
{
Value += incValue;
});
答案 0 :(得分:0)
您无疑已经解决了这个问题或继续前进,但是您的问题是垃圾回收。
该问题在this Stack Overflow answer中进行了描述,解决方案在此MVVMLight documentation item中进行了描述。
简而言之:您传递给RelayCommand
的命令action和enable函数存储有弱引用,因此,除非保留RelayCommand
之外的东西,否则它们将在某些时候被垃圾回收。 。解决方案是,如果您的操作或启用函数是闭包,则使用keepTargetAlive
构造函数参数。