2010-02-11 8 views

Respuesta

15

El problema es que la interfaz INotifyCollectionChanged que contiene el controlador de eventos se implementa de forma explícita, lo que significa que tiene que lanzó por primera vez la ItemCollection antes de que el controlador de eventos se puede utilizar:

public MyWindow() 
{ 
    InitializeComponent(); 

    ((INotifyCollectionChanged)mListBox.Items).CollectionChanged += 
     mListBox_CollectionChanged; 
} 

private void mListBox_CollectionChanged(object sender,  
    NotifyCollectionChangedEventArgs e) 
{ 
    if (e.Action == NotifyCollectionChangedAction.Add) 
    { 
     // scroll the new item into view 
     mListBox.ScrollIntoView(e.NewItems[0]); 
    }  
} 

Ref.

También se deben considerar los consejos de Josh sobre la colección observable.

+0

Gracias Mitch! ¡Funcionó! Sin embargo, me encontré con este raro error. El cuadro de lista está enlazado a un CollectionViewSource donde el origen es un XMLDocument. Especifiqué XPath como .XPath = "/ RootNode/ChildNode". El error extraño es que "a veces" cuando lance mi aplicación, visualizo el cuadro de lista, contiene un elemento (NO DEBERÍA) y cuando revisé el ListBoxItem, el artículo está en XMLDocument y tiene "" Esto ocurre, dice 2/5 veces. Publiqué la pregunta anterior para saber cuándo se ha agregado un elemento, pero después de este comportamiento extraño, recibí un NotifyCollectionChangedAction.Reset – lionheart

+0

difícil de decir sin ver el código que puebla el documento XML. Tal vez tiene que ver con la carga asincrónica. Pero sigo creyendo que estás luchando contra un modelo al que WPF trata de guiarte al profundizar en los elementos de ItemCollection. Nunca debería siquiera tener que pensar en ItemCollection o ListBoxItem a menos que esté escribiendo un control. – Josh

+0

¿Hay alguna forma de obtener el contenedor ('mListBox') del evento' private void mListBox_CollectionChanged (object sender, NotifyCollectionChangedEventArgs e) 'usando el' sender' tal vez? – Bolu

2

Tome un enfoque diferente. Cree un ObservableCollection (que tiene un event) y establezca el ItemsSource del ListBox en esta colección. En otras palabras, en WPF debes pensar sobre el problema de manera diferente. El control no es necesariamente lo que se está modificando ... la colección detrás de él sí lo es.

ACTUALIZACIÓN
Basado en su comentario a la respuesta del Mitch, que indica el origen de enlace es en realidad un documento XML, sugiero mirar en conectar al evento XObject.Changed del documento XML/elemento/etc. Esto le permitirá cambiar la información sobre la estructura XML en sí, no la ItemCollection, que es un detalle de implementación que no debería tener en cuenta. Por ejemplo, ItemCollection (o cualquier INotifyCollectionChanged) no garantiza un evento individual para cada cambio. Como ha notado, algunas veces obtendrá una notificación de restablecimiento genérica.

Cuestiones relacionadas