2017-03-08 6 views
0

Ich Erzeugung dynamisch Schaltflächen auf den Inhalt einer Datei abhängig.RelayCommand mit Lambda führt nur einmal

Mein Code wird nur ausgeführt, die RelayCommand einmal, wenn ich es auf diese Weise schreiben:

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

aber wenn ich es so ändern, dass das Lambda auf den Tag propery gesetzt ist es jedes Mal

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 
arbeitet

Was geht hier vor? Wird der Zuordnungswert beibehalten, um einen Referenzzähler am Leben zu erhalten? Ich bin ziemlich neu in C#, also könnte ich etwas übersehen, das für den erfahreneren Entwickler offensichtlich ist.

+1

Nur damit Sie wissen, in mvvm sollte der Befehl nie etwas über die Benutzeroberfläche kennen. Befehle sollten im Ansichtsmodell definiert werden, das die Ansicht nicht kennen oder interessieren soll. Dann verwenden Sie in der Ansicht Bindung, um den Befehl für die Schaltfläche festzulegen. –

Antwort

2

Garbage Collection schlägt wieder!

Es ist nicht schrecklich hier offensichtlich, aber RelayCommand uses a WeakAction den Verweis auf die „Ausführen“ Methode zu speichern. Dies bedeutet, dass die von Ihnen übergebene Action der Müllabfuhr unterliegt.

Die Chancen stehen gut Sie up-Fenster des Performance Monitor ziehen können, fügen Sie die Garbage Collection Zähler Gen0, und sehen Sie Ihre Taste eine Sammlung erfolgt zur gleichen Zeit aufhören zu arbeiten. Ein Beispiel finden Sie in my answer here.

+0

Kurz nachdem ich die Frage gestellt hatte, kam ich über diese Antwort und war mir sehr sicher, dass das auch mein Problem war. – RedX