MVVM ViewModel per visualizzare la messaggistica
-
22-09-2019 - |
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
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):