ObservableCollection<T>, INotifyPropertyChanged y WinRT

NOTA: Este post está basado en la versión Developers Preview de Windows 8, que salió en Septiembre del 2011. Versiones posteriores pueden dejar (y con suerte dejarán) este artículo obsoleto.

Un post cortito: Si desarrollas aplicaciones Metro para Windows 8 usando C# y XAML no uses ObservableCollection<T>. Simple y llanamente no funciona.

En su lugar debe usarse IObservableVector<T> interfaz de la cual podéis encontrar una implementación aquí: http://code.msdn.microsoft.com/Data-Binding-7b1d67b5/sourcecode?fileId=44725&pathId=1428387049. Esa implementación proporciona además un método ToObservableVector para convertir una INotifyCollectionChanged (es decir una ObservableCollection<T>) en un IObservableVector<T>.

Relacionado con el tema: ojo con implementar INotifyPropertyChanged. En concreto, ojo con cual implementas pues resulta que ahora hay dos! Por un lado está el INotifyPropertyChanged de toda la vida (System.ComponentModel.INotifyPropertyChanged) y por otro uno nuevo que es el que usa WinRT: Windows.UI.Xaml.Data.INotifyPropertyChanged. Ese último es el que tenéis que utilizar en vuestros ViewModels.

Desconozco el porque de estos cambios (no usar INotifyCollectionChanged ni el INotifyPropertyChanged de toda la vida), aunque supongo que tienen que ver en no usar colecciones ni eventos propios de .NET y tenerlo todo controlado dentro del API de WinRT. También supongo que en siguientes versiones de Windows 8 eso se arreglará.

Así que si no queréis, como yo, perder un buen rato preguntándoos porque no se actualiza una ListBox… ya sabéis! 😉

Un saludo!

PD: Algunos enlaces que he encontrado buscando acerca de esto:

  1. ObservableCollection no funciona: http://social.msdn.microsoft.com/Forums/en-AU/winappswithcsharp/thread/054913c2-6ad4-4b54-a349-c7ae846d4f8e
  2. Selecciona el INotifyPropertyChanged correcto en WinRT: http://blog.galasoft.ch/archive/2011/09/25/quick-tip-select-the-correct-inotifypropertychanged-in-windows-8.aspx –> Según menciona aquí esto parece que ya está corregido y que la nueva versión de Win8 ya no tendrá ese error.

5 comentarios sobre “ObservableCollection<T>, INotifyPropertyChanged y WinRT”

  1. Hola Eduard,

    La verdad que como siempre un buen post, pero yo creo que estos no se toman ni un café juntos para diseñar nuevos productos, pues no se han escrito lineas con INotifyPropertyChanged.

    Unos de forma prudente heredando de una clase que la implementaba otros en cada una de ellas.
    La verdad que hay cosas que no entiendo, llegara un momento en el que no se podrá llevar este ritmo 🙁

  2. Hola Pedro!
    Un placer verte por estos lares también… 😉

    Dicho esto, un par de puntualizaciones 🙂

    1. Esto es una Developers Preview. Es de esperar que esto esté de algún modo u otro arreglado en la versión final.

    2. Aunque usemos C# y XAML, NO estamos usando WPF ni Silverlight. La verdad es que no se han cargado INotifyPropertyChanged, «simplemente» lo han movido de sitio. El problema és que también estamos viendo el «antiguo» (y que es el que seguirá usándose en WPF y Silverlight). El tema de INotifyPropertyChanged no es muy proecupante, porque cuando el propio VS2011 te propone dos usings distintos, lo que te hace, al menos, estar alerta. El código antiguo seguirá funcionando en WinRT con una «simple» recompilación. Lo más «jodido» es lo de la ObservableCollection porque aquí si que VS2011 no puede ayudarte (ni una recompilación tampoco :p). Lo de que en WinRT no usen ObservableCollection tiene que ver, seguramente, con que no quieren ataduras a nada de .NET que no sea «propósito general». Seguramente en versiones finales, ObservableCollection no la tendremos disponible cuando desarrollemos bajo WinRT.

    Un abrazo y gracias por comentar! 😀

  3. Que yo sepa Windows 8 ni siquiera está en fase beta y lo que ha publicado Microsoft fue una preview, Así que, no solamente habrá cosas que no funcionen, si no, que también te las pueden cambiar.

    Así que cuidado con este tipo de artículos, porque se quedan purulando por la red y dentro de un tiempo, cuando salga la versión definitiva confundirán a la gente. Aunque por lo menos este tiene fecha.

  4. @andrechi
    Efectivamente Windows 8 no está siquiera en fase beta (en ningún momento afirmo lo contrario, ni hay ninguna crítica hacia MS por esa inconsistencia en la API). Incluso al final del artículo afirmo que en futuras versiones de Windows 8 seguramente eso estará arreglado.
    Que sea una Developers Preview no es impedimento para que empecemos a publicar detalles (desde tutoriales, hasta incosistencias como la de este post) a sabiendas de que pueden cambiar (y cambiarán) y que el material quedará obsoleto.

    Dicho esto, tienes razón en lo que planteas, así que he agregado una nota al inicio del post para que quede claro que el artículo está basado en la Developers Preview 🙂

    Muchas gracias por comentar! 😉

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *