Pregunta

Estoy usando Prism para la navegación en mi aplicación Wpf. Tengo algunos módulos, y cada uno de ellos se está registrando en un menú principal a través de comandos comunes enviados utilizando el contenedor IoC en el programa de arranque. Las entradas del menú están vinculadas a comandos comunes para la navegación, que abrirán la vista correcta en alguna región. Todo se basa en las recomendaciones que he encontrado a través del sitio de Prism.

Mi problema ahora es que tengo un módulo donde hay una condición que indica si quiero abrir ViewA o ViewB en la región principal. Ejemplo: Digamos que tengo un módulo de cliente, y luego un " Cliente " elemento de menú que abrirá el módulo del cliente en la vista principal. Y hay una condición: si tengo un cliente activo, quiero abrir CustomerDetailsView al hacer clic en el elemento del menú, de lo contrario, quiero abrir CustomersAdminView.

¿Cuál es el enfoque recomendado para resolver esto? Veo algunas opciones, pero creo que todas suenan un poco extravagantes. Ahora estoy trabajando para crear lo que sería un MasterCustomerView en el ejemplo anterior. Esta vista luego verificará la condición y abrirá el UserControl dando a los detalles de Admin. Sin embargo, no estoy completamente satisfecho con esta solución: ¿sería un enfoque legítimo? Algo mejor?

¿Fue útil?

Solución

En los sistemas de menús que construí alrededor de Prism, proporcioné una sobrecarga para los módulos que registran vistas que les permite pasar un delegado, en lugar del Tipo de vista. En este delegado puedo pasar información relevante al delegado para que pueda decidir cómo crear su vista.

Esto es un poco complicado, pero puedo darle algunos ejemplos relevantes.

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

     void RegisterMenuItem(string title, Type viewType);
}

Observe aquí que tengo un tipo que se pasa en "RelevantInformation" que puede contener al cliente actual, etc. Cuando el usuario hace clic en el elemento del menú, llamo al delegado y le paso toda la información que pueda necesitar para tomar su decisión. Devuelve un objeto Ver que luego puedo colocar en cualquier región que sea apropiada.

También permito que el módulo pase un '' canExecute '' delegado, similar a cómo funciona un comando (de hecho, tomo todos los registros del menú y los convierto en comandos). De esta forma, el módulo también puede optar por deshabilitarse si alguna condición en RelevantInformation invalidaría el elemento del menú.

En realidad, esta es solo una de las muchas maneras de resolver este problema, pero está cerca de lo que hago. Esperemos que lo encuentre útil o le haga pensar en formas alternativas de resolver el problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top