2017-03-08 77 views
0

我根据文件的内容动态生成按钮。带有lambda的RelayCommand只执行一次

我的代码只执行RelayCommand一次,如果我把它写在这样:

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

,但如果我改变它,以便拉姆达设置为标签属性格式它屡试不爽

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#相当陌生,所以我可能会忽略更有经验的开发人员。

+1

只是为了让你知道,在mvvm中,命令永远不应该知道任何关于用户界面的信息。应该在视图模型中定义命令,这不应该知道或关心视图。然后在视图中使用绑定来设置按钮的命令。 –

回答

2

垃圾收集再次袭击!

这里不是非常明显,但RelayCommand uses a WeakAction存储对“execute”方法的引用。这意味着您输入的Action需要垃圾回收。

很可能您可以拉起Window的性能监视器,添加Gen0垃圾收集计数器,并在发生收集的同时观察您的按钮停止工作。一个例子见my answer here

+0

不久之后,我问了一个问题,我回答了这个问题,并确信这也是我的问题。 – RedX