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

Foi útil?

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

em formação

Misture SDK

vídeo sobre comportamentos

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top