Pergunta

Estou usando a estrutura de luz MVVM, bem como a unidade para DI. Eu tenho algumas visões aninhadas, cada uma ligada a um viewModel correspondente. Os modelos do ViewModels estão vinculados à DataContext de controle raiz de cada visualização através da ideia do ViewModellocator que Laurent Bugnion colocou na luz MVVM. Isso permite encontrar viewmodels por meio de um recurso estático e controlar a vida útil dos modelos de exibição por meio de uma estrutura de injeção de dependência, neste caso a unidade. Ele também permite que a Blend Expression veja tudo em relação aos modelos de vista e como vinculá -los.

Como afirmei, as vistas têm uma dose saudável de nidificação, mas os modelos ViewModels realmente não sabem nada um sobre o outro. Uma visualização dos pais se liga ao seu modelo de vista correspondente através do recurso estático ViewModellocator (que usa a unidade para controlar a construção e a vida útil do objeto ViewModel). Essa visualização pai contém um controle do usuário nela que é outra sub-visualização, que depois segue e obtém seu ViewModel correspondente através do ViewModellocator também. Os viewmodels não têm referências ou conhecem nenhuma hierarquia em relação um ao outro.

Então, aqui está um exemplo de como os modelos ViewModels interagem via mensagens. Eu tenho uma visualização pai que possui um banco de dados da ComboBox para uma obserableCollection em seu ViewModel. O selecionado do ComboBox também está vinculado (bidirecional) a uma propriedade no ViewModel. Quando a seleção das alterações do ComboBox, isso é para acionar atualizações em outras visualizações e sub-visualizações. Atualmente, estou realizando isso através do sistema de mensagens encontrado na luz MVVM.

Então, eu estou me perguntando qual seria a melhor prática para obter informações de um viewmodel para outro? Nesse caso, o que eu preciso passar para o Sub-ViewModels é basicamente um Guid de usuário que representa o usuário atualmente conectado. A visão mais importante dos pais (bem, ViewModel) conhecerá essas informações, mas não tenho certeza de como abaixá-las nos sub-visualizações.

Algumas abordagens possíveis em que consigo pensar:

  • O Sub-ViewModel deve pedir ao recurso estático ViewModellocator para uma referência ao mesmo objeto que a visualização pai está usando e acessar a propriedade dessa maneira? Parece que o ViewModels passando pelas propriedades um do outro não é muito limpo e as junta desnecessariamente.

  • Já estou usando mensagens para notificar as sub-visualizações de que o usuário selecionou um novo item no ComboBox e para atualizar de acordo. Mas o tipo de objeto que está sendo selecionado no ComboBox não está realmente diretamente relacionado a esse valor de dados que as sub-visualizações precisam.

Foi útil?

Solução 2

Decidi que os sub-visualizadores publiquem uma mensagem solicitando as informações necessárias e depois que a VM pai assinasse esse tipo de mensagem e token de chave. Não quero usar demais essa comunicação significa, mas acho que será eficaz para alguns dados que estou tendo problemas para encontrar maneiras de avançar na hierarquia da visão. Até este ponto, a maioria dos dados que passam foi em resposta a eventos, mas nem todos os dados podem ser transmitidos dessa maneira, especialmente se os dados forem adquiridos ou o evento acontecer em uma tela diferente antes da nova visualização é até construído e lido para receber os dados.

Eu tive uma conversa no Twitter com alguns nomes conhecidos neste espaço (Glenn Block, John Papa e Rob Eisenberg). Eles sugeriram várias coisas como um padrão de visitante, mas eu não tinha certeza de que funcionaria tão bem sem uma hierarquia de VMs. Isso pode ser porque meu design foi praticamente o View-First, em oposição a uma abordagem de viewmodel-primeiro. Outra sugestão que pode ter sido viável seria modificar meu uso do ViewModellocator e injeção de dependência para incluir a capacidade de passar os valores de dados para as sub-VMs no tempo de criação. Eu tive um pouco de problema em imaginá -lo por causa da natureza estática do VML, e decidi que a solução de solicitação de mensagem que criei seria mais direta e simples por enquanto. Provavelmente terei que repensar a solução se houver muito mais dados que caem nessa situação.

Outras dicas

Eu já vi basicamente duas abordagens para isso. Para comunicação geral de V-VM, o padrão de agregador de eventos funciona muito bem.

Para hierarquias de VMs, no entanto, usar um padrão de visitante pode ser melhor. Com um visitante, você pode ter informações que fluem através da hierarquia, por exemplo, dando a cada criança uma referência à VM pai automaticamente.

Você também pode fazer isso com a EA, mas o desafio está passando informações suficientes na carga útil da mensagem, de modo que as crianças saibam que é algo de que devem se importar.

Quanto ao localizador da VM, absolutamente não! O material do localizador da VM é esticamente para a ligação na interface do usuário, não deve se soltar fora desse contexto (de maneira ideal).

Meu $ 0,02 Glenn

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