带有 lambda 的 RelayCommand 只执行一次

RelayCommand with lambda only executes once

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

如果我这样写,我的代码只执行一次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

这是怎么回事? assignment 是否保留了一些引用计数?我是 C# 的新手,所以我可能会忽略一些对更有经验的开发人员来说显而易见的事情。

垃圾回收再次来袭!

这里不是很明显,但是RelayCommand uses a WeakAction 存储对"execute" 方法的引用。这意味着您提交的 Action 需要进行垃圾回收。

很有可能您可以调出 Window 的性能监视器,添加 Gen0 垃圾收集计数器,然后观察您的按钮在收集发生的同时停止工作。有关示例,请参阅 my answer here