Pergunta

Estou usando o prism for navegação no meu aplicativo WPF. Eu tenho alguns módulos e cada um deles está se registrando em um menu principal através de comandos comuns enviados usando o contêiner do IOC no bootstrapper. As entradas do menu estão vinculadas a comandos comuns para navegação - que abrirão a visão correta em alguma região. Tudo é baseado em recomendações que encontrei no site do Prism.

Meu problema agora é que tenho um módulo em que há uma condição indicando se eu quero abrir o Viewa ou o ViewB na região principal. Exemplo: digamos que eu tenha um módulo de cliente - e depois um item de menu "cliente" que abrirá o módulo do cliente na visualização principal. E há uma condição: se eu tiver um cliente ativo, quero abrir o ClientDetailsView ao clicar no item de menu, caso contrário, quero abrir o CustomerAdMinView.

Qual é a abordagem recomendada para resolver isso? Eu vejo algumas opções, mas acho que todas elas parecem um pouco hacky. Agora estou trabalhando para criar o que seria um MasterCustomerview no exemplo acima. Essa visualização verificará a condição e abrirá o UserControl, fornecendo detalhes do administrador dentro. Não estou todo satisfeito com esta solução - seria uma abordagem legitim? Melhor?

Foi útil?

Solução

Nos sistemas de menus que eu criei em torno do Prism, forneci uma sobrecarga para módulos que registram visualizações que lhes permitem passar por um delegado, em vez do tipo de visualização. Neste delegado, posso passar informações relevantes para o delegado para que ele possa decidir como criar sua visão.

Isso é um pouco complicado, mas posso lhe dar alguns exemplos relevantes.

public interface IMenuRegistry
{
     void RegisterMenuItem(string title, 
                           Func<RelevantInformation, Object> executeFunction, 
                           Func<RelevantInformation, bool> canExecuteFunction);

     void RegisterMenuItem(string title, Type viewType);
}

Observe aqui que eu tenho um tipo que é passado em "informação relevante" que pode conter o cliente atual etc. Quando o usuário clica no item de menu, eu chamo o delegado e passa todas as informações necessárias para tomar sua decisão. Ele retorna um objeto de visualização que eu posso colocar em qualquer região apropriada.

Também permito que o módulo passe um delegado "Canexecute", semelhante ao modo como um comando funciona (na verdade, pego todos os registros do menu e os transformo em comandos). Dessa forma, o módulo também pode optar por se desativar se alguma condição na informação relevante tornaria o item de menu inválido.

Na realidade, essa é apenas uma das muitas maneiras de resolver esse problema, mas isso é próximo do que eu faço. Espero que você ache útil ou faça você pensar em maneiras alternativas de resolver o problema.

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