none
Binding con propiedad solo LINQ RRS feed

  • 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
    domingo, 14 de abril de 2013 17:29

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 Development
    MCTS | SharePoint 2010, Configuring
    MS | Programming in HTML5 with JavaScript and CSS3 (MS)
    Twitter | @saintwukong

    lunes, 15 de abril de 2013 10:24

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 Development
    MCTS | SharePoint 2010, Configuring
    MS | Programming in HTML5 with JavaScript and CSS3 (MS)
    Twitter | @saintwukong

    lunes, 15 de abril de 2013 10:24
  • 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

    domingo, 19 de mayo de 2013 1:20
  • 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 Development
    MCTS | SharePoint 2010, Configuring
    MS | Programming in HTML5 with JavaScript and CSS3 (MS), Developing ASP.NET MVC 4 Web Applications
    Twitter | @saintwukong

    domingo, 19 de mayo de 2013 21:15