tutorial template español data c# wpf mvvm data-binding

c# - español - wpf data template



Ejemplos concretos de compartición de estado entre múltiples modelos de vista(WPF MVVM) (1)

Tengo un proyecto de WPF / Entity Framework (4.0) con muchos objetos. Me gustaría construir la aplicación para que pueda tener el estado de selección de objetos compartido en viewmodels.

Por ejemplo: tenemos clases de automóviles, conductores, pasajeros y carga. También tenemos UserControls para CarList, DriverList, etc. y ventanas de edición para CarEditor, DriverEditor, etc. Además, tenemos viewmodels para todos estos (CarListViewModel, DriverListViewModel, CargoEditorViewModel, etc.). Todo esto compone una interfaz acoplable donde el usuario puede tener múltiples listas de objetos, editores y visualizadores abiertos.

Lo que quiero es un ejemplo de código concreto de cómo conectar varios modelos de vista para que seleccionar un coche en la Lista de automóviles haga que ese coche entre en funcionamiento en CarEditorView, pero también se seleccione en cualquier otra vista para la que el contexto sea válido (como un DriverByCarView o simplemente DriverList si hay un predicado de filtro).

Hay una serie de sugerencias y discusiones basadas en esta pregunta. Los dos métodos que parecen dominar son:

  • 3018307 : Discute el intercambio de estado mencionando un subsistema de mensajería
  • 1159035 : 1159035 uso compartido de estado mediante el uso de un modelo de vista adjunto

¿Es uno de estos enfoques mejor que el otro?

¿Alguien tiene un ejemplo concreto de cualquiera de estos métodos en la forma de un proyecto de redacción o de código pequeño?

Todavía estoy aprendiendo WPF, por lo que los indicadores de los puntos de entrada para leer los fundamentos de la API son apreciados, pero al buscar ejemplos de código es a dónde voy habitualmente.

Gracias

En caso de que alguien esté interesado, aquí hay algunas otras discusiones similares:

  • 3816961 : Analiza la devolución de múltiples viewmodels según el tipo de objeto (es decir, una colección de tipos arbitrarios que se adhieren a una interfaz específica)
  • 1928130 : 1928130 si es una buena idea agregar modelos de vista como propiedades de otros modelos de vista (por ejemplo, un modelo de vista MainWindow compuesto por modos de vista de panel)
  • 1120061 : esencialmente discute si se debe usar una estrategia de modelo de vista por modelo o una estrategia de modelo de vista por elemento.
  • 4244222 : Analiza si anidar o no los modelos de vista al usar una jerarquía de objetos anidados.
  • 4429708 : 4429708 compartir colecciones entre viewmodels directamente, pero no entra en detalles.
  • Elemento de la lista : analiza la administración de selecciones múltiples dentro de un único modelo de vista.

Una forma típica de lograr esto es utilizar un messenger para publicar un mensaje CarSelected que detalla el automóvil seleccionado. Cero o más ViewModels pueden suscribirse al mensaje CarSelected. Los ViewModels que están interesados ​​en el automóvil actualmente seleccionado pueden escuchar el mensaje y luego actuar en consecuencia.

El enfoque de mensajería proporciona un diseño desacoplado limpio donde los editores y los suscriptores no tienen dependencias entre sí, por lo que pueden evolucionar fácilmente de forma independiente, solo necesitan saber sobre el mensaje del automóvil. Los mensajeros son una implementación del patrón de mediación.

En Prism, el messenger es el EventAggregator y se usa para publicar y suscribirse a mensajes.

Actualizar

Además de las ventajas arquitectónicas que trae el EventAggregator , también implementa eventos débiles para evitar problemas de pérdida de memoria con suscriptores que no anulan la suscripción explícitamente.

Por favor, consulte lo siguiente para la documentación de EventAggregator:

http://msdn.microsoft.com/en-us/library/ff649187.aspx

Prisma:

http://compositewpf.codeplex.com/

Ejemplo de prisma

public class ViewModel1 { private readonly IEventAggregator _eventService; private Car _selectedCar; public ViewModel1(IEventAggregator eventService) { _eventService = eventService; } //Databound property... public Car SelectedCar { set { _selectedCar = value; var msg = new CarSelectedMessage { Car = _selectedCar }; _eventService.GetEvent<CarSelectedEvent>().Publish(msg); } } } public class ViewModel2 { public ViewModel2(IEventAggregator eventService) { eventService.GetEvent<CarSelectedEvent>().Subscribe(msg => { //DoStuff with msg... }); } } public class Car {} public class CarMessage { public Car Car { get; set; } } public class CarSelectedEvent : CompositePresentationEvent<CarMessage> {}