2012-06-06 9 views
13

Ich entwickle eine Anwendung in WPF mit MVVM, aber ich bin mit den ICommand-Objekten fest.So aktivieren Sie eine Schaltfläche mit ihrer CanExecute-Methode

Ich habe ein Fenster, die einige Schaltflächen enthält, so, ich sie zu ihren jeweiligen ICommand in XAML binden wie folgt:

<Button Command="{Binding DoSomethingCommand}" Content="Do Something" /> 

Dann habe ich aus meiner Sicht-Modellklasse geschrieben haben folgendes:

Also, da ich brauche, dass meine Taste nicht aktiviert ist, wenn das Fenster zum ersten Mal geöffnet wird, setze ich meine Variable isDoSomethingButtonEnabled auf false. Und es funktioniert, die Schaltfläche ist am Anfang deaktiviert, aber mein Problem ist, dass wenn ich die Variable isDoSomethingButtonEnabled zu true zur Laufzeit ändern, meine Schaltfläche immer noch deaktiviert ist.

Ich habe sogar einige Tests nach dem Ändern der Variablen isDoSomethingButtonEnabled zu true, Drucken des Ergebnisses DoSomethingCommand.CanExecute() und es zeigt "wahr"!

also, was soll ich tun, um meine Taste zu aktivieren ??

Vielen Dank im Voraus

+0

MVVM ein Muster ist, spielt es keine speziellen Klassen wie DelegateCommand erfordern. Verwenden Sie PRISM? –

+0

Ja, ich bin. Eigentlich muss ich es verwenden – Dante

Antwort

14

ein Ereignis CanExecuteChanged auf der ICommand Schnittstelle, die aufgerufen wird: sollte

Tritt ein, wenn Änderungen auftreten, die beeinflussen, ob der Befehl auszuführen.

Mit dem Prism DelegateCommand Sie dieses Ereignis mit dem RaiseCanExecuteChanged Verfahren erhöhen können:

public void SomeMethod() 
{ 
    //do some work 
    isDoSomethingButtonEnabled = true; 
    DoSomethingCommand.RaiseCanExecuteChanged(); 
} 
+0

danke für Ihre Antwort. Ich habe versucht, was Sie nur geschrieben haben, aber mein ICommand-Objekt hat keine solche Methode, es hat das Ereignis 'CanExecuteChanged', muss ich eine Methode hinzufügen? – Dante

+1

Sie haben diese Methode bereits, Sie müssen nur Ihren 'DoSomethingCommand' von' ICommand' in 'DelegateCommand ' umwandeln. Versuchen Sie es in Ihrer Probe mit '((DelegateCommand ) DoSomethingCommand) .RaiseCanExecuteChanged();' – nemesv

+0

Oder Sie können den Typ von 'DoSomethingCommand' von' ICommand' in 'DelegateCommand ' ändern. – nemesv