2009-07-01 7 views
2

Ich habe ein wenig gegoogelt und habe keine Antwort auf dieses Rätsel gefunden.Benutzeroberfläche Interaktion mit der MVVM

Vorausgesetzt, Sie haben folgende Voraussetzungen erfüllt sein:

  • MySuperView
  • MySuperViewModel

MySuperView hat zwei Textfelder beide gebunden an String-Eigenschaften auf der Ansichtsmodell und Ihr einen DelegateCommand mit Ihrem ‚Save binden 'Taste zum ViewModel mit Syntax wie:

ViewModel:

this.SaveOrderCommand = new DelegateCommand<object>(this.Save, this.CanSave); 

Ausblick:

Command="{Binding SaveOrderCommand}" 

Wie gehen Sie mit UI-Elemente behandeln die Benutzer-Interaktion gefälliger zu machen. Nehmen wir zum Beispiel an, dass während der Sicherungsaktion des DelegateCommand ein Fehler auf einer niedrigeren Ebene aufgetreten ist und Sie den Tooltip einer der TextBoxen auslösen möchten. Wie würde dies typischerweise auftreten?

Ich würde gerne so sauber Code-behind wie möglich bleiben, aber ich bin nicht abgeneigt, UI-spezifischen Code dort zu setzen.

Antwort

0

Grundsätzlich möchten Sie eine create -Eigenschaft für Ihre Ansicht zu beobachten (in der Regel durch Trigger), die Ihre UI je nachdem, was in Ihrer Codeausführung passiert, aktualisieren würde.

1

Zum Anzeigen von Ausnahmen in einer QuickInfo würde ich dem ViewModel eine Eigenschaft hinzufügen, die die Fehlermeldung als Zeichenfolge aufzeigt und diese an die QuickInfo Ihrer TextBox bindet. Dann würden Sie in Ihrer Save-Methode damit beginnen, diese Eigenschaft auf die leere Zeichenfolge zu setzen und dann die gesamte echte Arbeit in einem try..catch auszuführen, das bei Auftreten einer Ausnahme die Ausnahmebedingungsnachricht in diese Eigenschaft überträgt, so dass sie automatisch angezeigt wird in der QuickInfo.

Sie müssten eine Änderungsbenachrichtigung für Ihre Property bereitstellen, indem Sie eine DependencyProperty erstellen oder INotifyPropertyChanged verwenden.

6

Ich würde empfehlen, dass Ihr ViewModel IDataErrorInfo implementiert, damit Sie Validierungskram in WPF nutzen können. Sie müssen nicht warten, bis jemand auf die Schaltfläche zum Speichern klickt. Sobald das Textfeld aktualisiert wurde, wird es validiert.

public string this[ColumnName] 
{ 
    if (Column == "TextProperty") 
    { 
    if(!ValidateTextProperty()) 
     return "TextProperty is invalid"; 
    } 
} 

void Save(object param) 
{ 
    if (CanSave) 
    { 
    if (string.IsNullOrEmpty(this["TextProperty"]) 
    { 
     //Add Save code here 
    } 
    } 
} 

Ihrer Ansicht:

<TextBox Text={Binding TextProperty, ValidateOnDataErrors="true", 
UpdateSourceTrigger=PropertyChanged}/> 

Dies wird rund um die Textbox ein rotes Feld setzen und Sie können einen Fehler bei der Überprüfung Vorlage in die Textbox Stil hinzufügen, ein Tooltip hinzuzufügen sehen here