我根据文件内容动态生成按钮。
如果我以这种方式编写代码,我的代码只会执行一次RelayCommand:
var button = new Button();
button.Command = new RelayCommand(() => Messenger.Default.Send(new UseThisValue(value));
// button gets added to a treeview
但是如果我改变它以便将lambda设置为Tag propery它每次都有效
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#还是比较陌生的,所以我可能会向更有经验的开发人员忽略一些明显的东西。
答案 0 :(得分:2)
垃圾收集再次发生!
这里不是很明显,但是RelayCommand
uses a WeakAction
将引用存储到"执行"方法。这意味着您提交的Action
将受到垃圾回收。
很有可能你可以拉起Window的性能监视器,添加Gen0垃圾收集计数器,并观察你的按钮在收集发生的同时停止工作。有关示例,请参阅my answer here。