c# wpf navigation prism

c# - ¿Cómo pasar un objeto al navegar a una nueva vista en PRISM?



wpf navigation (4)

Tengo mi propia técnica.

Extraigo el código hash del objeto y lo guardo en un Dictionary , con el código hash como clave y el objeto como el valor del par.

Luego, adjunto el código hash a UriQuery .

Después, solo tengo que obtener el código hash que proviene del Uri en la vista de destino y usarlo para solicitar el objeto original del Dictionary .

Un código de ejemplo:

Clase de repositorio de parámetros:

public class Parameters { private static Dictionary<int, object> paramList = new Dictionary<int, object>(); public static void save(int hash, object value) { if (!paramList.ContainsKey(hash)) paramList.Add(hash, value); } public static object request(int hash) { return ((KeyValuePair<int, object>)paramList. Where(x => x.Key == hash).FirstOrDefault()).Value; } }

El código de la persona que llama:

UriQuery q = null; Customer customer = new Customer(); q = new UriQuery(); Parameters.save(customer.GetHashCode(), customer); q.Add("hash", customer.GetHashCode().ToString()); Uri viewUri = new Uri("MyView" + q.ToString(), UriKind.Relative); regionManager.RequestNavigate(region, viewUri);

El código de vista de destino:

public partial class MyView : UserControl, INavigationAware { // some hidden code public void OnNavigatedTo(NavigationContext navigationContext) { int hash = int.Parse(navigationContext.Parameters["hash"]); Customer cust = (Customer)Parameters.request(hash); } }

Eso es.

Hasta donde yo sé, actualmente PRISM permite pasar cadenas, pero no permite pasar objetos. Me gustaría saber cuáles son las formas de superar este problema.

Quiero pasar una colección de listas. El UriQuery no es útil en mi caso, ¿qué debo hacer en este caso?


Puede crear un evento PRISM con ''objeto'' getter / setter. Rise evento con su objeto fundido o no lanzado a ''objeto'' dentro del evento (depende si la implementación del evento ''compartido'' como en los proyectos famosos de ''Infraestructura'') y luego Navegue a Región. En ViewModel que implementa Region - Subscribe () al evento anterior, recíbalo y almacénelo localmente y luego simplemente espere la llamada a la función ''OnNavigatedTo''. Cuando se llama a OnNavigatedTo, ya tiene el objeto / clase / struct y puede ejecutar ViewModel.

Por ejemplo - Clase de evento:

namespace CardManagment.Infrastructure.Events { using Microsoft.Practices.Prism.Events; /// <summary> /// Event to pass ''Selected Project'' in between pages /// </summary> public class SelectedProjectViewEvent : CompositePresentationEvent<SelectedProjectViewEvent> { public object SelectedPorject { get; set; } } }

Clase ''Llamada''

/// <summary> /// Called when [back to project view]. /// </summary> /// <param name="e">The e.</param> public void OnBackToProjectView(CancelEditProjectEvent e) { eventAggregator.GetEvent<SelectedProjectViewEvent>().Publish(new SelectedProjectViewEvent() { SelectedPorject = selectedProject }); regionManager.RequestNavigate(WellKnownRegionNames.ProjectViewRegion, new System.Uri("ProjectDetailsView", System.UriKind.Relative)); }

Y esto en la clase ''Receptor''

/// <summary> /// Called when the implementer has been navigated to. /// </summary> /// <param name="navigationContext">The navigation context.</param> public void OnNavigatedTo(NavigationContext navigationContext) { if (this.SelectedProject == null) // <-- If event received untill now this.ShouldBeVisible = false; else this.ShouldBeVisible = true; }


Prisma 5 y 6: la clase NavigationParameters ahora se puede utilizar para pasar parámetros de objetos durante la navegación, utilizando las sobrecargas del método RequestNavigate de una región o instancia de RegionManager.


También puede ver cómo pasar objetos si está utilizando un IOC y desea usar la inyección de constructor.

https://.com/a/20170410/1798889