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

标签 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;

            });

最佳答案

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

问题在 this Stack Overflow answer 中描述解决方案在此 MVVMLight documentation item 中有所描述.

简而言之:您传递给 RelayCommand 的命令操作和启用功能用弱引用存储,所以除非除了 RelayCommand 之外的东西捕获它们,它们将在某个时候被垃圾收集。解决方法是使用keepTargetAlive如果您的操作或启用函数是闭包,则构造函数参数。

关于wpf - GalaSoft MvvmLight RelayCommand 在访问闭包时停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32516460/

相关文章:

c# - WPF 防止数据网格在窗口大小调整时自动调整大小

c# - 如何访问嵌套在 View 模型中的 ObservableCollection

xamarin - 我们什么时候应该更喜欢 mvvm cross 而不是 mvvm light,反之亦然?

wpf - 在转换器中绑定(bind) ICommand

wpf - 如何将关闭命令绑定(bind)到按钮

wpf - 我的数据绑定(bind)在控件加载之前没有被评估,我在控件加载后得到属性更改事件,为什么?

c# - 如何将WPF页面添加到tabcontrol?

mvvm - 使用 MVVM 模式和 MVVM Light 单击后退按钮时如何返回预览页面?

c# - 根据 ViewModel 属性更改画笔

WPF 数据网格 : CommandBinding to a double click instead of using Events