2017-03-08 101 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