Nach der Unterstützung von William und Xamarin konnte ich endlich herausfinden, wie die Funktionalität funktioniert.
Es ist ein wenig kontra intuitiv, wie wir erwarten, die Schaltfläche zu aktivieren/deaktivieren (ToolbarItem), aber wir müssen tatsächlich den Status des Befehls verwalten, der an die Schaltfläche gebunden ist. Sobald wir dieses Muster verstehen, macht es Sinn. Das Command-Objekt vom Typ ICommand hat eine CanExecute-Eigenschaft (danke, William, um es darauf hinzuweisen). Nun möchten Sie nicht direkt auf es zugreifen/es verwenden, es sei denn, es ist tatsächlich zu überprüfen, ob der Befehl ausgeführt werden kann nicht.
überall dort, wo Sie in Ihrem Code für richtig halten, um den Zustand des Befehls zu ändern, müssen Sie die folgende Zeile hinzufügen:
((Command)_myCommand).ChangeCanExecute();
Diese Linie wird die CanExecute Eigenschaft zwingt, wird für den angegebenen neu bewertet Befehl.
Ich persönlich entschied, es hinzuzufügen, wo ich die Inaktivität aufspüren, wie es in meiner Anwendung sinnvoll war.
public bool Inactive {
get {
return _inactive;
}
set {
if (_inactive != value) {
_inactive = value;
((Command)_myCommand).ChangeCanExecute();
OnPropertyChanged();
}
}
}
In der Ansicht gibt es keine Veränderungen festgestellt werden:
<ToolbarItem Text="Run" Command="{Binding MyCommand}" />
Nun, wenn Sie das Command-Objekt erstellen ist, wo die große Arbeit wird getan werden. Wir verwenden normalerweise den Konstruktor für einzelne Argumente, wie es allgemein genug ist, und hier definieren wir, was unser Befehl tut. Interessanterweise gibt es auch einen Konstruktor mit zwei Parametern, in dem Sie die Funktion/Aktion angeben können, die den Wert der CanExecute-Eigenschaft bestimmt.
_myCommand = new Command (async() => {
Inactive = false;
await Run();
Inactive = true;
},
() => {
return Inactive;
});
public ICommand MyCommand {
get {
return _myCommand;
}
}
Edit: Ich weiß, dass technisch den Wert von Inaktiv zu ändern in Run() passieren soll, aber zu Demonstrationszwecken ...
Hinweis, habe ich versucht, „ToolbarItem“ mit einem „Button“ ersetzt und kläglich gescheitert: „Objekttyp Xamarin.Forms.Button kann nicht Typ Ziel umgewandelt werden: Xamarin.Forms.ToolbarItem“. – LostBalloon
abhängig von der erwarteten Länge Ihrer Operation, wenn Sie es auf dem UI-Thread ausführen, bleibt die Schaltfläche gedrückt. es ist ein hässlicher Hack und du solltest es nicht für den Netzwerkzugriff verwenden, da das deine App für eine sehr lange Zeit sperren kann. –