2010-02-11 4 views

ответ

15

Проблема заключается в том, что интерфейс INotifyCollectionChanged который содержит обработчик событий явно реализован, что означает, что вы должны сначала привести ItemCollection перед обработчик событий может быть использован:

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.

Совет Джоша о наблюдаемой коллекции также следует учитывать.

+0

Спасибо Mitch! Это сработало! Однако я столкнулся с этой странной ошибкой. Списокbox привязан к CollectionViewSource, где источником является XMLDocument. Я указал XPath как .XPath = "/ RootNode/ChildNode". Странная ошибка в том, что «иногда», когда я запускаю свое приложение, отображаю список, содержит элемент (НЕ ДОЛЖЕН), и когда я проверил ListBoxItem, элемент находится в XMLDocument, имеющем в нем «« Это происходит 2/5 раза. Я отправил предыдущий вопрос, чтобы я знал, когда элемент будет обработан, но с какой-то странной ситуацией, я получаю NotifyCollectionChangedAction.Reset – lionheart

+0

Трудно сказать, не видя кода, который заполняет XML-документ. Возможно, это связано с асинхронной загрузкой. Но я все еще верю, что вы боретесь с моделью WPF пытается помочь вам, копаясь во внутренностях ItemCollection. Вам действительно не нужно даже думать о ItemCollection или ListBoxItem, если вы не пишете элемент управления. – Josh

+0

Есть ли способ получить контейнер ('mListBox') из события' private void mListBox_CollectionChanged (object sender, NotifyCollectionChangedEventArgs e) ', используя' sender', может быть? – Bolu

2

Возьмите другой подход. Создайте ObservableCollection (у которого есть такой event) и установите ItemsSource в ListBox для этой коллекции. Другими словами, в WPF вы должны думать о проблеме по-разному. Элемент управления не обязательно является тем, что изменяется ... коллекция за ним.

UPDATE
Основываясь на ваш комментарий к ответу Митча, который указывает ваш источник привязки на самом деле XML документ, я предлагаю смотреть на подключение к событию XObject.Changed из XML документа/элемент/и т.д.. Это даст вам информацию об изменении самой структуры XML - не ItemCollection, которая представляет собой деталь реализации, которую вам не нужно учитывать. Например, ItemCollection (или любой INotifyCollectionChanged) не гарантирует отдельное событие для каждого изменения. Как вы отметили, иногда вы просто получите общее уведомление об отказе.

Смежные вопросы