Czy istnieje procedura obsługi zdarzenia, która zostanie wywołana, gdy element zostanie dodany w polu listy w WPF?Obsługa zdarzeń, która zostanie wywołana, gdy element zostanie dodany w polu listy
Dzięki!
Czy istnieje procedura obsługi zdarzenia, która zostanie wywołana, gdy element zostanie dodany w polu listy w WPF?Obsługa zdarzeń, która zostanie wywołana, gdy element zostanie dodany w polu listy
Dzięki!
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ę.
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.
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
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
Czy istnieje sposób na uzyskanie kontenera ('mListBox') z zdarzenia' private void mListBox_CollectionChanged (object sender, NotifyCollectionChangedEventArgs e) 'używając' sender' maybe? – Bolu