GalaSoft MvvmLight RelayCommand在访问闭包时停止工作

4
我努力使用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;

            });

我也遇到了同样的错误。如果还没有报告,肯定应该报告。 - devuxer
1
没有看到错误报告,所以我添加了一个:https://mvvmlight.codeplex.com/workitem/7721。如果您想要看到这个问题得到解决,请为该错误投票。谢谢。 - devuxer
1个回答

2
你无疑已经解决了这个问题或者放弃了,但是你的问题是垃圾回收。
问题在Stack Overflow答案中有所描述,解决方案在MVVMLight文档项中有所描述。
简而言之:你传递给RelayCommand的命令操作和启用函数使用了弱引用进行存储,因此除非除了RelayCommand之外还有其他东西持有它们,否则它们将在某个时刻被垃圾回收。如果你的操作或启用函数是闭包,解决方案是使用keepTargetAlive构造函数参数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接