Principales respuestas
Binding con propiedad solo LINQ

Pregunta
-
Hola,
Tengo un problema con los Bindings, a ver si alguien me puede echar una mano.
Resulta que en el ViewModel tengo varios datos que obtengo de consultas LINQ de la lista principal. Por ejemplo,
private ObservableCollection<Vehicle> _vechicles = new ObservableCollection<Vehicle>(); public ObservableCollection<Vehicle> Vechicles { get { return _vechicles; } set { _vechicles = value; } }
Y a partir de esta lista obtengo datos, como por ejemplo
public int TotalVehicles { get { return _vechicles.Count(); } }
Lo que quiero es "bindear" el TotalVehicles a un elemento de la UI, pero como el dato se cambia dependiendo de la lista (no tengo un "set" en TotalVehicles) en la UI nunca se actualiza.
Como podría hacerlo para que cuando cambie la lista se actualice tambien todas las propierades que se obtienen a partir de consultas SQL? Es posible que esté siguiendo un planteamiento erróneo y no es bueno usar propiedades que se obtienen de consultas LINQ?
Un saludo y gracias de antemano!
ACTUALIZACION:
He encontrado un workarround. Cada vez que modifico la lista llamo manualmente a los metodos
RaisePropertyChanged("GetType1Vehicles");
RaisePropertyChanged("TotalVehicles");
El problema es que llamarlo dentro de un metodo (por ejemplo "CambiarTipo" porque dentro de este metodo selecciono un vehiclulo y le cambio el tipo, con lo que tengo que refrescar la propiedad "GetTypeVehicles) no me gusta nada. Alguna idea mejor?
- Editado user86723212zx domingo, 14 de abril de 2013 18:49 Añadida mas info
Respuestas
-
Hola Jalapenyo.
Los RaisePropertyChange yo los pondría dentro del set de la ObservableCollection de vehículos.
Otra idea sería usar un helper, pero prefiero la primera idea que te di.
"En los momentos de crisis, sólo la imaginación es más importante que el conocimiento"MCTS | SharePoint 2010, Application DevelopmentMCTS | SharePoint 2010, ConfiguringMS | Programming in HTML5 with JavaScript and CSS3 (MS)Blog | Blog en GeeksTwitter | @saintwukong- Propuesto como respuesta Omar OrtizModerator jueves, 23 de mayo de 2013 14:53
- Marcado como respuesta Omar OrtizModerator lunes, 27 de mayo de 2013 21:11
Todas las respuestas
-
Hola Jalapenyo.
Los RaisePropertyChange yo los pondría dentro del set de la ObservableCollection de vehículos.
Otra idea sería usar un helper, pero prefiero la primera idea que te di.
"En los momentos de crisis, sólo la imaginación es más importante que el conocimiento"MCTS | SharePoint 2010, Application DevelopmentMCTS | SharePoint 2010, ConfiguringMS | Programming in HTML5 with JavaScript and CSS3 (MS)Blog | Blog en GeeksTwitter | @saintwukong- Propuesto como respuesta Omar OrtizModerator jueves, 23 de mayo de 2013 14:53
- Marcado como respuesta Omar OrtizModerator lunes, 27 de mayo de 2013 21:11
-
Hola Jalapenyo.
Una solución algo más elegante puede ser, inicializar la lista en el constructor de la ViewModel y luego en vez de cambiar la referencia a la lista, solo cambiar los elementos. Es decir cada vez que tengas nuevos vehiculos, en vez de crear una lista nueva y perder la referencia, puedes solamente decirle a la lista que ya tienes que borre todos y añada los nuevos y está como es una ObservableCollection si lo notificará a la interfaz.
Esto así dicho queda un poco feo, pero si usas un par de métodos de extensión para ObservableCollections como los que te voy a pasar ahora, sería mas sencillo:
public static class ObservableCollectionExtensions { public static void AddRange<T>(this ObservableCollection<T> collection, IEnumerable<T> items) { foreach (var item in items) { collection.Add(item); } } public static void SetRange<T>(this ObservableCollection<T> collection, IEnumerable<T> items) { collection.Clear(); collection.AddRange(items); } }
Con AddRange, teniendo una lista, le puedes añadir otra tanda de elementos con solo una llamada. Y el de SetRange, lo que hace es dejar el número de elementos a 0 y añadir los nuevos.
En cuanto a la opción del número de vehículos en la lista....podrías hacerlo creándote una propiedad que implemente INotifyPropertyChange...y cada vez que cambies algún elemento llamar a TotalVehicles = _vehicles.Count(); Y esta sola si tiene el RaisePropertyChange ya lo notificará automáticamente.
Un saludo!
Adrián Fernández
-
Hola Adrián.
Lo que estás proponiendo es dar un rodeo.
No es necesario vaciar la colección y después añadir una nueva lista (pérdida de rendimiento) cuando puedes asignar la nueva lista directamente que es más eficiente y rápido.
Por otro lado, al realizar un nuevo set de la lista de vehículos es el momento adecuado para notificar que el número de elementos puede haber cambiado y no es necesario realizar una nueva llamada a la cuenta de la lista.
"En los momentos de crisis, sólo la imaginación es más importante que el conocimiento"MCTS | SharePoint 2010, Application DevelopmentMCTS | SharePoint 2010, ConfiguringMS | Programming in HTML5 with JavaScript and CSS3 (MS), Developing ASP.NET MVC 4 Web ApplicationsBlog | Blog en GeeksTwitter | @saintwukong