C# 带有lambda的RelayCommand只执行一次

C# 带有lambda的RelayCommand只执行一次,c#,wpf,mvvm-light,c#-6.0,C#,Wpf,Mvvm Light,C# 6.0,我根据文件的内容动态生成按钮 如果我以以下方式编写,则我的代码仅执行RelayCommand一次: var button = new Button(); button.Command = new RelayCommand(() => Messenger.Default.Send(new UseThisValue(value)); // button gets added to a treeview 但是如果我更改它,使lambda设置为标记属性,它每次都工作 var button = n

我根据文件的内容动态生成按钮

如果我以以下方式编写,则我的代码仅执行RelayCommand一次:

var button = new Button();
button.Command = new RelayCommand(() => Messenger.Default.Send(new UseThisValue(value));
// button gets added to a treeview
但是如果我更改它,使lambda设置为标记属性,它每次都工作

var button = new Button();
button.Tag = new Action(() => Messenger.Default.Send(new UseThisValue(value));
button.Command = new RelayCommand(button.Tag as Action);
// button gets added to a treeview

这是怎么回事?服务器是否保留了一些引用计数?我对C#还相当陌生,所以我可能忽略了一些对更有经验的开发人员来说显而易见的事情。

垃圾收集又来了

这里不是很明显,而是存储对“execute”方法的引用。这意味着您提交的
操作将接受垃圾收集


很有可能您可以打开窗口的性能监视器,添加Gen0垃圾收集计数器,并在收集发生的同时观察按钮停止工作。请参见示例。

垃圾回收再次罢工

这里不是很明显,而是存储对“execute”方法的引用。这意味着您提交的
操作将接受垃圾收集


很有可能您可以打开窗口的性能监视器,添加Gen0垃圾收集计数器,并在收集发生的同时观察按钮停止工作。请参阅以获取示例。

让您知道,在mvvm中,命令永远不会了解任何有关用户界面的信息。命令应该在视图模型中定义,视图模型不应该知道或关心视图。然后在视图中使用绑定来设置按钮的命令。只是为了让您知道,在mvvm中,命令永远不会知道任何关于用户界面的信息。命令应该在视图模型中定义,视图模型不应该知道或关心视图。然后在视图中使用绑定来设置按钮的命令。在我问了这个问题后不久,我得到了这个答案,并且非常确定这也是我的问题。在我问了这个问题后不久,我得到了这个答案,并且非常确定这也是我的问题。