Domanda

Domanda MVVM.Messaggistica tra ViewModel e View, come è implementata al meglio?

L’applicazione presenta alcuni punti di “comunicazione utente” quali:"Hai inserito commenti per questa selezione.Vuoi salvare o eliminare” quando cambia il valore di una selezione Sì/No/NA.Quindi ho bisogno di un modo proibito di associazione View ai "messaggi" di ViewModel.

Ho seguito il percorso iniziando con Messenger di MVVM Foundation.Tuttavia si tratta più di una trasmissione a livello di sistema che di un modello evento/abbonato.Pertanto, se l'app ha due istanze di una vista (Person1 EditView e Person2 EditView) aperte, entrambe ricevono il messaggio quando un ViewModel pubblica il messaggio "vuoi salvare".

Che approccio hai utilizzato?

Grazie Andy

È stato utile?

Soluzione

Per tutto ciò utilizzeresti l'associazione come metodo di "comunicazione".Ad esempio, il messaggio di conferma potrebbe essere mostrato o nascosto in base alle proprietà impostate nel ViewModel.

Ecco la vista

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

Ed ecco il tuo 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
          }
     }
}

Questo non è un campione completo (l'unica opzione è sì!:)), ma si spera che questo dimostri che la tua View e il tuo ViewModel sono quasi un'entità e non due che si telefonano tra loro.

Spero che questo ti aiuti.

Altri suggerimenti

Che Anderson descrive è probabilmente sufficiente per la particolare esigenza che descrivi. Tuttavia, si consiglia di guardare in comportamenti Expression Blend , che forniscono supporto potente per le interazioni tra i modelli vista e punti di vista, che possono essere utili in scenari più complessi - utilizzando vincolante per 'messaggi' solo si ottiene così più lontano.

Nota, l'SDK Expression Blend è liberamente disponibile - non c'è bisogno di utilizzare Expression Blend per utilizzare l'SDK o il comportamento; anche se l'IDE Miscela non ha il supporto integrato per una migliore 'drag and drop' di comportamenti.

Si noti inoltre ogni 'comportamento' è un componente - in altre parole si tratta di un modello estendibile; ci sono alcuni comportamenti incorporati nel SDK, ma è possibile scrivere i propri comportamenti.

Ecco alcuni link. (Nota, non lasciare che il 'silverlight' nell'URL vi seduca - i comportamenti sono supportati sia per WPF e Silverlight):

informazioni

Miscela SDK

video su comportamenti

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top