Laden...

[gelöst] DelegateCommand - RaiseCanExecuteChanged wird ohne Commandbinding nicht ausgeführt

Erstellt von Potestas vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.684 Views
P
Potestas Themenstarter:in
20 Beiträge seit 2007
vor 9 Jahren
[gelöst] DelegateCommand - RaiseCanExecuteChanged wird ohne Commandbinding nicht ausgeführt

Hallo,

ich baue mit PRISM aktuell eine Anwendung.
Nun habe ich das Problem, dass ich einen DelegateCommand habe, welcher aber nicht in die View gebunden wird. Damit kommt der Command wohl nicht zurecht, was dazu führt, dass RaiseCanExecuteChanged nicht ausgeführt wird.

Sobald ich den Command an einen (für meine Zwecke nutzlosen) Button binden funktioniert alles wie es soll. Lasse ich den Button, bzw. die Bindung an die Oberfläche weg funktioniert es nicht mehr.

Hat da jemand eine Erklärung für mich parat?
Bin etwas ratlos, was die UI-Bindung mit der Auswertung des CanExecute zu tun hat.

Für diesen Zwecke nun einen Button einzubauen kann ja nicht die Lösung sein!

Bin gespannt auf die Antworten 😃

Viele Grüße

H
114 Beiträge seit 2007
vor 9 Jahren

Hallo Potestas,

da ich aktuell auch ein Projekt mit Prism umsetzen darf, hat mich die Frage interessiert und ich habe mal einen Blick in den Sourcecode von Prism geworfen.
Das Verhalten was du beobachtest, hat nichts direkt mit der Oberfläche zu tun. Aber bei dem DelegateCommand gibt es etwas wichtiges zu beachten...
Abonenten des CanExecuteChanged-Events werden vom DelegatCommand nur als schwache Referenz gehalten. Das heißt wenn sonst keine Referenz mehr auf dieses Objekt existiert, kann es passieren, dass der GC das Objekt abräumt, bevor der Event ausgelöst wird! Bindest du das Command an einen Button, so wird dieser als "harte" Referenz innerhalb der Oberfläche gehalten und es funktioniert wie erwartet.
Das Ganze steht auch so in der Dokumentation, siehe DelegateCommandBase.CanExecuteChanged Event (Remarks-Abschnitt)

Grüße, HiGHteK

P
Potestas Themenstarter:in
20 Beiträge seit 2007
vor 9 Jahren

Vielen Dank HiGHteK, daran lag es 👍