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

时间:2015-09-11 05:57:31

标签: wpf mvvm-light commandbinding

我很难使用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;

            });

1 个答案:

答案 0 :(得分:0)

您无疑已经解决了这个问题或继续前进,但是您的问题是垃圾回收。

该问题在this Stack Overflow answer中进行了描述,解决方案在此MVVMLight documentation item中进行了描述。

简而言之:您传递给RelayCommand的命令action和enable函数存储有弱引用,因此,除非保留RelayCommand之外的东西,否则它们将在某些时候被垃圾回收。 。解决方案是,如果您的操作或启用函数是闭包,则使用keepTargetAlive构造函数参数。