2011-02-26 21 views
19

Estoy construyendo una aplicación de demostración para aprender las funciones de navegación de Prism 4. La aplicación tiene dos módulos - cada uno tiene tres vistas:Prisma 4: RequestNavigate() no funciona

  • un control de usuario con un texto bloque ("Bienvenido al Módulo a")
  • un RibbonTab (utilizando un adaptador Región), y
  • un botón de tareas estilo Outlook (como correo de Outlook, calendario, etc.)

La Shell tiene tres regiones nombradas: "RibbonRegion", "TaskB" uttonRegion "y" WorkspaceRegion ". Las Vistas se cargan en estas regiones. Para probar la configuración básica, registré las tres Vistas con el Administrador de Región de Prisma, para que se cargaran al inicio, y todo funcionó como se esperaba.

A continuación, modifiqué la configuración para que solo los botones de tareas se cargaran al inicio. Otras vistas solo se cargarían si se solicita, al hacer clic en un botón de Tarea. Mis inicializadores módulo aspecto:

public void Initialize() 
{ 
    /* We register the Task Button with the Prism Task Button Region because we want it 
    * to be displayed immediately when the module is loaded, and for the lifetime of 
    * the application. */ 

    // Register Task Button with Prism Region 
    m_RegionManager.RegisterViewWithRegion("TaskButtonRegion", typeof(ModuleATaskButton)); 

    /* We register these objects with the Unity container because we don't want them 
    * instantiated until we navigate to this module. */ 

    // Register View and Ribbon Tab as singletons with Unity container 
    m_Container.RegisterType(typeof(ModuleAView), "ModuleAView", new ContainerControlledLifetimeManager()); 
    m_Container.RegisterType(typeof(ModuleARibbonTab), "ModuleARibbonTab", new ContainerControlledLifetimeManager()); 
} 

Cuando el usuario hace clic en un botón de tareas, invoca un objeto ICommand que llama IRegionManager.RequestNavigate() para mostrar los puntos de vista:

El comando se invoca cuando una tarea se hace clic en el botón, pero lo que me pasa es lo siguiente:

Demo app screen shot

El control de usuario está cargando parecer como System.Object, y sospecho que RibbonTab está cargando lo mismo. Creo que el problema es con mi llamada RequestNavigate(), o mi registro con Unity. Pero no puedo identificar el problema.

¿Alguien puede arrojar algo de luz sobre lo que está pasando? Gracias por tu ayuda.

+0

¿te importaría echarle un vistazo? http://stackoverflow.com/questions/18309661/navigation-not-occurring –

Respuesta

28

Definitivamente este salió. La respuesta está en la Guía del desarrollador de Microsoft Prism (Ver 4), páginas 120-121. Tiene dos partes:

primer lugar, el UserControl y RibbonTab objetos fueron resolviendo desde la Unidad como System.Object tipos. Esa es una limitación de Unity y la sobrecarga que utilicé para registrar los objetos de visualización. Para conseguir que se resuelven a los tipos correctos, es necesario utilizar una sobrecarga diferente para IUnityContainer.RegisterType():

// Register other view objects with DI Container (Unity) 
m_Container.RegisterType<Object, ModuleAView>("ModuleAView"); 
m_Container.RegisterType<Object, ModuleARibbonTab>("ModuleARibbonTab"); 

Esta sobrecarga mapas nativa System.Object resolución de la Unidad para el tipo correcto de la vista solicitada. Ver la nota en p. 120 de la Guía del desarrollador.

El segundo problema no se indicó explícitamente en mi pregunta, pero ocurrió cuando solucioné el primer problema. Quería que se eliminara cada módulo RibbonTab cuando cambié al otro módulo. Como mi Ribbon Region actúa como un ItemsControl, ambos RibbonTabs terminaron mostrándose - El Módulo A RibbonTab no se descargó cuando cambié al Módulo B. Para resolver ese problema, implementé IRegionMemberLifetime en las clases RibbonTab. Esa cuestión está cubierta en p. 121 de la Guía del desarrollador.

BTW, implementé la interfaz IRegionMemberLifetime en los objetos Ver, en lugar de sus Modelos de vista, porque la interfaz no afecta el back-end de la aplicación, solo el objeto de vista.

+3

+1 Acabas de alegrarme el día. Exactamente mi problema Plus solution :-) –

+2

Gracias por responder a su pregunta para que todos podamos ver los resultados. – Thelonias

+0

sí, funcionó para mí. Pero la pregunta es si necesito registrar la interfaz de tipo para verla para g: registerType ("ViewA"); tiene el mismo problema con el que te enfrentaste, ¿cómo podemos solucionarlo? – WPFKK

Cuestiones relacionadas