2010-02-11 9 views

Odpowiedz

15

Problem polega na tym, że interfejs INotifyCollectionChanged który zawiera procedurę obsługi zdarzenia jest wyraźnie wdrożone, co oznacza, że ​​trzeba najpierw rzucić ItemCollection zanim można stosować obsługi zdarzeń:

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.

Porady Josh dotyczące obserwowalnej kolekcji również powinny być brane pod uwagę.

+0

Dzięki Mitch! Zadziałało! Jednak spotkałem ten dziwny błąd. Listbox jest powiązany z CollectViewSource, gdzie źródłem jest XMLDocument. Podałem XPath jako .XPath = "/ RootNode/ChildNode". Dziwny błąd to "czasami", gdy uruchamiam moją aplikację, wyświetlam listbox, zawiera on element (NIE POWINIEN go przeglądać) i kiedy sprawdzam ListBoxItem, element jest w XMLDocument posiadający w nim "" To się zdarza powiedzieć 2/5 razy. Opublikowaliśmy poprzednie pytanie, aby wiedzieć, kiedy element jest adowany, ale gdy zachowuję się dziwnie, otrzymuję NotifyCollectionChangedAction.Reset – lionheart

+0

Trudno powiedzieć, nie widząc kodu zapełniającego dokument XML. Może ma to związek z ładowaniem asynchronicznym. Ale nadal wierzę, że walczysz z modelem WPF, który próbuje cię poprowadzić poprzez zagłębianie się w elementy ItemCollection. Naprawdę nigdy nie powinieneś nawet myśleć o ItemCollection lub ListBoxItem, chyba że piszesz kontrolę. – Josh

+0

Czy istnieje sposób na uzyskanie kontenera ('mListBox') z zdarzenia' private void mListBox_CollectionChanged (object sender, NotifyCollectionChangedEventArgs e) 'używając' sender' maybe? – Bolu

2

Podejmij inne podejście. Utwórz ObservableCollection (który ma takie event) i ustawić ItemsSource ListBox do tej kolekcji. Innymi słowy, w WPF powinieneś pomyśleć o problemie inaczej. Kontrola niekoniecznie musi być modyfikowana ... kolekcja jest za tym.

UPDATE
Bazując na swoim komentarzu do odpowiedzi Mitcha, który wskazuje źródło wiążący jest faktycznie dokument XML, proponuję patrząc podpinania się do zdarzenia XObject.Changed dokumentu XML/elementu/etc. To da ci zmianę informacji o samej strukturze XML - a nie ItemCollection, który jest szczegółem implementacji, którego nie powinieneś brać pod uwagę. Na przykład ItemCollection (lub jakakolwiek INotifyCollectionChanged) nie gwarantuje pojedynczego zdarzenia dla każdej zmiany. Jak zauważyłeś, czasami otrzymujesz ogólne powiadomienie o resetowaniu.

Powiązane problemy