Frage

MVVM Frage. Messaging zwischen Viewmodel und anzeigen, wie es am besten umgesetzt werden?

Die Anwendung verfügt über einige Punkte der „Benutzerkommunikation“ wie: „Sie haben eingegeben Kommentare für diese Auswahl. Wollen Sie speichern oder zu verwerfen“, wenn der Wert eines Ja / Nein / NA Auswahl ändert. Also ich brauche etwas verbotene Weise des Blicks auf das „Botschaften“ des Ansichtsmodelles verbindlich.

Ich ging Weg nach unten, beginnend mit MVVM Stiftung Messenger. Doch das ist eher eine systemweite Sendung dann ein Ereignis / Subscriber-Modell. Also, wenn die App zwei Instanzen einer Ansicht (Person1 EditView und Person2 EditView) hat öffnen sie beide die Nachricht erhalten, wenn ein Ansichtsmodell veröffentlicht das „tun Sie speichern möchten“ -Meldung.

Welcher Ansatz haben Sie verwendet?

Danke Andy

War es hilfreich?

Lösung

Für all das würden Sie Bindung als Methode für „Kommunikation“ verwenden. Zum Beispiel könnte die Bestätigungsmeldung basierend auf Eigenschaften in Ihrem Ansichtsmodell gesetzt oder ausgeblendet werden.

Hier ist die Ansicht

<Window.Resources>
     <BoolToVisibilityConverter x:key="boolToVis" />
</Window.Resources>
<Grid>

<TextBox Text="{Binding Comment, Mode=TwoWay}" />
<TextBlock Visibility="{Binding IsCommentConfirmationShown, 
                        Converter={StaticResource boolToVis}" 
           Text="Are you sure you want to cancel?" />

<Button Command="CancelCommand" Text="{Binding CancelButtonText}" />
</Grid>

Und hier ist Ihr Ansichtsmodell

// for some base ViewModel you've created that implements INotifyPropertyChanged
public MyViewModel : ViewModel 
{
     //All props trigger property changed notification
     //I've ommited the code for doing so for brevity
     public string Comment { ... }
     public string CancelButtonText { ... }
     public bool IsCommentConfirmationShown { ... }
     public RelayCommand CancelCommand { ... }


     public MyViewModel()
     {
          CancelButtonText = "Cancel";
          IsCommentConfirmationShown = false;
          CancelCommand = new RelayCommand(Cancel);
     }

     public void Cancel()
     {
          if(Comment != null && !IsCommentConfirmationShown)
          {
               IsCommentConfirmationShown = true;
               CancelButtonText = "Yes";
          }
          else
          {
               //perform cancel
          }
     }
}

Dies ist keine vollständige Probe (die einzige Option, ja! :)), aber hoffentlich dies zeigt, dass Ihre Anzeigen und Ihr Ansichtsmodell fast eine Einheit sind und nicht zwei, die sind zu telefonieren miteinander.

Hope, das hilft.

Andere Tipps

Was Anderson beschreibt, ist wahrscheinlich ausreichend für die jeweilige Anforderung, die Sie beschreiben. Allerdings möchten Sie vielleicht Expression Blend Behaviors Blick in , die für Wechselwirkungen zwischen Ansicht Modelle und Ansichten leistungsstarke Unterstützung bieten, die in komplexeren Szenarien nützlich sein können - mit Bindung für ‚Nachrichten‘ werden Sie nur so erhalten weit.

Beachten Sie, die Expression Blend SDK ist frei verfügbar - Sie müssen nicht Expression Blend zu verwenden, um das SDK oder das Verhalten verwenden; obwohl die Mischung IDE für ‚Drag & Drop‘ von Verhaltensweisen besser integrierte Unterstützung hat.

Beachten Sie auch, jedes ‚Verhalten‘ ist eine Komponente - in anderen Worten, es ist ein erweiterbares Modell; gibt es ein paar eingebaute in Verhaltensweisen im SDK, aber Sie können Ihre eigenen Verhaltensweisen schreiben.

Hier sind einige Links. (Beachten Sie, lassen Sie sich nicht die ‚Silverlight‘ in der URL verleiten Sie - Verhalten sowohl für WPF und Silverlight unterstützt werden):

Informationen

Mischung SDK

Video auf Verhalten

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top