MVVM ViewModel para ver mensagens
-
22-09-2019 - |
Pergunta
Pergunta MVVM. Mensagens entre ViewModel e View, como é melhor implementado?
O aplicativo possui alguns pontos de "comunicação do usuário", como: "Você inseriu comentários para esta seleção. Deseja salvar ou descartar ”quando o valor de uma seleção sim/não/NA mudar. Por isso, preciso de uma maneira proibida da visão que se une às "mensagens" do ViewModel.
Eu segui o caminho começando com o Mensageiro da MVVM Foundation. No entanto, isso é mais uma transmissão em todo o sistema do que um modelo de evento/assinante. Portanto, se o aplicativo tiver duas instâncias de uma visualização (Person1 EditView e Person2 EditView), as duas recebam a mensagem quando um ViewModel publicar a mensagem "Você deseja salvar".
Que abordagem você usou?
Obrigado Andy
Solução
Por tudo isso, você usaria a ligação como seu método para "comunicação". Por exemplo, a mensagem de confirmação pode ser mostrada ou oculta com base nas propriedades definidas no seu ViewModel.
Aqui está a 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>
E aqui está o seu 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
}
}
}
Esta não é uma amostra completa (a única opção é sim! :)), mas espero que isso ilustre que sua visualização e seu viewmodel são quase uma entidade e não dois que estão fazendo telefonemas um para o outro.
Espero que isto ajude.
Outras dicas
O que Anderson descreve provavelmente é suficiente para o requisito específico que você descreve. No entanto, você pode querer olhar para Comportamentos de mistura de expressão que fornecem suporte poderoso para interações entre modelos de visualização e visualizações, o que pode ser útil em cenários mais complexos - usando a ligação para 'mensagens' apenas o levará até agora.
Observe que o SDK da mistura de expressão está disponível gratuitamente - você não precisa usar a mistura de expressão para usar o SDK ou o comportamento; Embora o IDE da mistura tenha um melhor suporte embutido para 'arrastar e gotar' de comportamentos.
Além disso, observe que cada 'comportamento' é um componente - em outra palavra, é um modelo extensível; Existem alguns comportamentos internos no SDK, mas você pode escrever seus próprios comportamentos.
Aqui estão alguns links. (Observe, não deixe o 'Silverlight' no URL enganá -lo - os comportamentos são suportados para WPF e Silverlight):