Ich habe einen Text ausgeführt werden, befehlen konnte, die wie folgt auf einen Befehl gebunden ist:Benutzer benachrichtigen, die nicht
<TextBox Text="{Binding Path=TextContent, UpdateSourceTrigger=PropertyChanged}">
<TextBox.InputBindings>
<KeyBinding Command="{Binding Path=MyCommand}" Key="Enter" />
</TextBox.InputBindings>
</TextBox>
Die Eigenschaft TextContent
eine Zeichenfolge im Ansichtsmodell definiert ist. Der Befehl MyCommand
ist ebenfalls im ViewModel definiert. Das ViewModel kennt die Ansicht nicht.
Der Befehl wird aufgerufen, wenn die TextBox den Fokus hat und die Eingabetaste gedrückt wird. Wenn CanExecute
den Wert false zurückgibt, kann der Benutzer leider (visuell) nicht sehen, dass der Befehl nicht ausgeführt wurde, da es keine sichtbare Änderung in der TextBox gibt.
Ich suche Ratschläge, wie man dem Benutzer zeigt, dass der Befehl nicht ausgeführt werden konnte, nachdem er Enter gedrückt hatte.
Meine Ideen (und meine Zweifel an ihnen):
Deaktivieren der TextBox wenn
CanExecute
kehrtfalse
: Das ist keine Option, da der Rückgabewert vonCanExecute
jedesmal, wenn ein Brief geschrieben wird ändern können/geändert (der Text in der TextBox beeinflusst das Ergebnis vonCanExecute
). Wenn es zum ersten Mal deaktiviert wird, kann der Benutzer nicht mehr hinein tippen, sodass es für immer deaktiviert bleibt.Ein Meldungsfeld anzeigen, dass der Befehl nicht ausgeführt wurde: Denken Sie daran, dass ViewModel die Ansicht nicht kennt. Ist es sogar möglich, eine Message Box vom ViewModel aus zu öffnen? Außerdem, wo sollte ich den Anruf zum Öffnen einer Nachrichtenbox setzen? Nicht innerhalb
CanExecute
, weil ich nur das Meldungsfeld nach dem Eingeben erhalten möchte, nicht immerCanExecute
false
zurückgibt. Vielleicht makeCanExecute
immertrue
zurückgeben und die Checks innerhalbExecute
: Wenn Schecks in Ordnung sind, tun Sie den Befehl Zeug, wenn nicht, zeigen Sie eine Nachricht an den Benutzer. Aber dann ist der PunktCanExecute
zu haben, ist völlig verfehlt ...
Ich möchte MVVM halten, aber einige Code-Behind für Sachen auf die Ansichtsmodell Umleitung scheint für mich in Ordnung.
In Bezug auf das Anzeigen von Meldungsfeldern aus dem 'View Model' können Sie einen ** service ** orientierten Ansatz verwenden, bei dem Sie eine Meldungsfeld-Serviceklasse injizieren können, die von Ihrem Ansichtsmodell zum Anzeigen von Meldungsfeldern verwendet werden kann. Dadurch wird sichergestellt, dass Ihr Ansichtsmodell dem MVVM-Muster entspricht. Ich habe eine kleine Bibliothek geschrieben, die das auf [GitHub] (https://github.com/mike-eason/MessageBoxAbstraction) tut. –