Como detectar que se ha modificado los items de un ItemsControl

Después de unos días en PortAventura gritando como un loco en el Furius Baco (teneis que probarla) os cuento un problema que me surgió, tenia que detectar cuando había sido añadido o eliminado items de un ItemsControl, en este caso una ListBox, estos items podían ser añadidos y eliminados sin mi control solo cambiaba la colección. Supuse que seria bastante fácil, que estaría el  evento CollectionChanged pero cuando me puse a mirar me lleve la decepción que no estaba, no me creía que no estuviese así que me dedique a mirar mas a fondo y vi que estaba pero no estaba explícitamente implementado ya que INotifyCollectionChanged que es la que contiene este manejador no esta implementado explícitamente.

La manera de solucionarlo, con un casting

  1. public MyWindow()  
  2. {  
  3.     InitializeComponent();  
  4.       
  5.     ((INotifyCollectionChanged)mListBox.Items).CollectionChanged +=  
  6.         mListBox_CollectionChanged;  
  7. }  
  8.   
  9. private void mListBox_CollectionChanged(object sender,    
  10.     NotifyCollectionChangedEventArgs e)  
  11. {  
  12.     if (e.Action == NotifyCollectionChangedAction.Add)  
  13.     {  
  14.         // realizar el scrool hasta el nuevo item  
  15.         mListBox.ScrollIntoView(e.NewItems[0]);  
  16.     }      
  17. }    

No es la manera mas elegante pero me sirvió

4 comentarios sobre “Como detectar que se ha modificado los items de un ItemsControl”

  1. Hola Kenrae, en efecto la solución mejor hubiera sido haber utilizado una ObservableCollection y haber utilizado el evento CollectionChanged, pero no lo habia programado yo y fue imposible convencer al cliente de hacerlo asi porque la lista la cogia de un webservice y no queria hacer la transformación a ObservableCollection.
    Para aquellos que quieran profundizar en como se haria con ObservableCollection les recomiendo este articulo http://msdn.microsoft.com/en-us/magazine/dd252944.aspx

Responder a anonymous Cancelar respuesta

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