2016-08-09 20 views
0

Ich bind DelegateCommands auf Schaltflächen in der Benutzeroberfläche. Und ich verwende kein Prisma. Jetzt möchte ich bestimmte Steuerelemente auf der Benutzeroberfläche deaktivieren/ausblenden, wenn auf eine Schaltfläche geklickt wird.Deaktivieren Sie mehrere GUI-Steuerelemente beim Klicken auf die Schaltfläche

Muss ich die Disable/Hide-Logik in den Execute-Handler des DelegateCommand selbst setzen? Besonderer Fokus hier: Hintergrund Worker Thread.

this.MyCommand = new DelegateCommand(MyExecutehandler); 

    void MyExecutehandler(object obj){ 
    // 1.) disable controls here 
    // 2.) long running operation on background worker here 
    // 3.) enable the controls again in the worker_completed handler? 
    } 

Die Steuerelemente werden dann über MVVM deaktiviert/aktiviert.

+1

Ein Vorschlag. Versuchen Sie 'Async erwarten 'anstelle von BG-Arbeiter. Und ich finde nichts falsch beim Schreiben der Sperrlogik im Ausführungshandler des Delegatbefehls. – ViVi

+0

Hm, ja, wenn es reine MVVM ist, sollte das auch funktionieren, weil ich den Dispatcher in reinem MVVM nicht haben werde. – Legends

+0

Das ist ein Missverständnis. Sie können 'Dispatcher' auch in reinem MVVM haben. :) – ViVi

Antwort

0

Sie können die Sichtbarkeit Eigenschaft der Steuerelemente binden, die Sie wollen Werte deaktivieren und in MyExecutehandler Funktion gesetzt Eigenschaft

+0

Das wurde nicht gefragt. Aber Ihr Ansatz würde eine Abhängigkeit zum UI-Framework schaffen ... also ist bool der Weg in Verbindung mit einem Konverter – Legends

1

Besonderes Augenmerk hier auf visibility.collapse: Hintergrund Worker-Thread

Also mache ich nur eine Annahme, dass Sie fragen, wie Sie den Status der Benutzeroberflächensteuerung von einem anderen Thread ändern können.

Normalerweise benutzen wir weit unter dem UI-Thread der Kontrolle von Arbeitsthread

this.Dispatcher.BeginInvoke(<your delegate here>) 

aber ich vermute, zu modifizieren, dass Sie nicht, dass im Hintergrund Worker-Thread tun können, als ‚this‘ wird meist abweichen. So können Sie dies versuchen:

button.Dispatcher.BeginInvoke(new Action(()=> 
{ 
//disable button here 
})); 

Es ist wie Worker-Thread eine Nachricht senden, um UI-Thread zu sagen, um den Delegaten auszuführen.

Noch eine Sache, normalerweise haben wir ein Steuerelement deaktiviert und eine Schaltfläche nach einem Prozess erneut aktivieren, um einige unnötige angefügte Ereignis/propertychange Ereignis zu vermeiden. Also vermute ich Sie dies benötigen:

Sie können getan, dass durch das Entfernen Ereignis vorübergehend:

button -= button_click_event 

und Re-add-Ereignis nach dem

button += button_click_event 

Hoffnung, das hilft.