2010-02-11 5 views

Répondre

15

Le problème est que l'interface INotifyCollectionChanged qui contient le gestionnaire d'événements est explicitement mis en œuvre, ce qui signifie que vous devez d'abord jeter le ItemCollection avant que le gestionnaire d'événements peut être utilisé:

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.

Les conseils de Josh sur la collection observable devraient également être pris en compte.

+0

Merci Mitch! Ça a marché! Cependant, j'ai rencontré ce bug bizarre. La zone de liste est liée à une CollectionViewSource où la source est un XMLDocument. J'ai spécifié XPath comme .XPath = "/ RootNode/ChildNode". Le bug bizarre est que "parfois" quand je lance mon application, affiche la liste, il contient un élément (DEVRAIT pas) et quand j'ai vérifié le ListBoxItem, l'élément est dans XMLDocument ayant "" Ceci est fait dire 2/5 fois. J'ai posté la question précédente afin que je sache quand un article est ajouté mais quand le bizarre behvior hapen, je reçois un NotifyCollectionChangedAction.Reset – lionheart

+0

Difficile à dire sans voir le code qui remplit le document XML. Peut-être que cela a à voir avec le chargement asynchrone. Mais je crois toujours que vous vous battez contre un modèle que WPF essaie de vous guider en creusant dans les internes de ItemCollection. Vous ne devriez jamais avoir à penser à ItemCollection ou ListBoxItem à moins d'écrire un contrôle. – Josh

+0

Existe-t-il un moyen d'obtenir le conteneur ('mListBox') de l'événement' private mLid mListBox_CollectionChanged (expéditeur d'objet, NotifyCollectionChangedEventArgs e) 'en utilisant' l'expéditeur' peut-être? – Bolu

2

Adoptez une approche différente. Créez un ObservableCollection (qui a un tel event) et définissez la ItemsSource de ListBox à cette collection. En d'autres termes, dans WPF, vous devriez penser différemment au problème. Le contrôle n'est pas forcément ce qui est en train d'être modifié ... la collection qui l'accompagne est.

MISE À JOUR
Sur la base de votre commentaire à la réponse de Mitch qui indique votre source de liaison est en fait un document XML, je vous suggère de regarder dans l'accrochage à l'événement XObject.Changed du document XML/élément/etc. Cela vous donnera des informations sur la structure XML elle-même - et non sur ItemCollection, un détail d'implémentation que vous ne devriez pas prendre en compte. Par exemple, ItemCollection (ou tout INotifyCollectionChanged) ne garantit pas un événement individuel pour chaque modification. Comme vous l'avez noté, vous aurez parfois une notification de réinitialisation générique.

Questions connexes