Question

question MVVM. Messagerie entre ViewModel et View, comment est-il mieux mis en œuvre?

L'application a quelques points de « communication utilisateur » comme: « Vous avez saisi les commentaires pour cette sélection. Est-ce que vous souhaitez enregistrer ou annuler » lorsque la valeur d'un changement de sélection Oui / Non / NA. Donc, j'ai besoin d'une certaine façon proscrite de la vue liaison aux « messages » du ViewModel.

Je suis descendu chemin en commençant par Messenger de MVVM Fondation. Quoi qu'il en est plus d'une émission à l'échelle du système, puis un modèle événement / abonné. Donc, si l'application a deux instances d'une vue (Person1 EditView et Person2 EditView) ouvert ils ont tous deux le message quand on ViewModel publie le message « voulez-vous sauver ».

Quelle approche avez-vous utilisé?

Merci Andy

Était-ce utile?

La solution

Pour tout cela, vous utiliserez la liaison comme méthode pour « communication ». Par exemple, le message de confirmation peut être affiché ou masqué en fonction des propriétés définies dans votre ViewModel.

Voici la vue

<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>

Et voici votre ViewModel

// 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
          }
     }
}

Ce n'est pas un échantillon complet (la seule option est oui! :)), mais nous espérons que cela montre que votre vue et votre ViewModel sont presque une entité et non deux qui effectuent des appels téléphoniques à l'autre.

Hope this helps.

Autres conseils

Qu'est-ce que Anderson décrit est probablement suffisant pour l'exigence particulière que vous décrivez. Cependant, vous pouvez regarder dans Expression Behaviors Blend qui offrent un soutien puissant pour les interactions entre la vue des modèles et des points de vue, qui peuvent être utiles dans des scénarios plus complexes - en utilisant la liaison pour « messages » ne vous obtenez loin.

Note, le kit de développement de mélange d'expression est disponible gratuitement - vous ne devez pas utiliser Expression Blend pour utiliser le SDK ou le comportement; bien que l'IDE Blend ne meilleur support intégré pour 'drag and drop' des comportements.

En outre, notez chaque « comportement » est un composant - en d'autres termes, il est un modèle extensible; il y a quelques comportements intégrés dans le SDK, mais vous pouvez écrire vos propres comportements.

Voici quelques liens. (Note, ne laissez pas le « silverlight » dans l'URL que vous égarent - les comportements sont pris en charge à la fois WPF et Silverlight):

informations

SDK Blend

vidéo comportements

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top