2017-03-08 1 views
0

Je génère des boutons dynamiquement en fonction du contenu d'un fichier.RelayCommand avec lambda ne s'exécute qu'une seule fois

Mon code exécute seulement le RelayCommand une fois si je l'écris ainsi:

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

mais si je change pour que le lambda est réglé sur la propery Tag, il fonctionne à chaque fois

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 

Que se passe-t-il ici? L'assignmend garde-t-il un certain nombre de références en vie? Je suis assez nouveau à C# donc je pourrais négliger quelque chose d'évident pour le développeur plus expérimenté.

+1

Juste pour que vous sachiez, dans mvvm la commande ne devrait jamais rien savoir de l'interface utilisateur. Les commandes doivent être définies dans le modèle de vue, qui n'est pas censé connaître ou prendre en compte la vue. Ensuite, dans la vue, vous utilisez la liaison pour définir la commande pour le bouton. –

Répondre

2

La collecte des ordures se déclenche à nouveau!

Ce n'est pas très évident ici, mais RelayCommand uses a WeakAction pour stocker la référence à la méthode "execute". Cela signifie que le Action que vous avez entre les mains est sujet à la collecte des ordures.

Les chances sont bonnes que vous puissiez tirer sur le moniteur de performances de Windows, ajouter le compteur de récupération de place Gen0, et regarder votre bouton cesser de fonctionner en même temps qu'une collecte se produit. Voir my answer here pour un exemple.

+0

Peu de temps après que j'ai posé la question je suis venu à travers cette réponse et était très sûr que c'était aussi mon problème. – RedX