2009-06-16 10 views
9

J'ai ce que je crois devrait être simple liaison de données bidirectionnelle dans l'installation WPF, mais la liste (cible) ne se met pas à jour lorsque la collection change.WPF ListBox ne pas mettre à jour avec le ItemsSource

J'installe cette ItemsSource du ListBox programme:

lstVariable_Selected.ItemsSource = m_VariableList; 

Et la zone de liste est déclarée comme suit:

  <ListBox Margin="5" Name="lstVariable_Selected"> 
       <ListBox.ItemsPanel> 
       <ItemsPanelTemplate> 
        <VirtualizingStackPanel Orientation="Horizontal"/> 
       </ItemsPanelTemplate> 
       </ListBox.ItemsPanel> 
       <ListBox.ItemTemplate> 
       <DataTemplate> 
        <Border BorderBrush="Gray" BorderThickness="1" Margin="0"> 
         <TextBlock FontSize="25" Text="{Binding Path=Name}" /> 
        </Border> 
       </DataTemplate> 
       </ListBox.ItemTemplate> 
      </ListBox> 

Quand je mets d'abord le ItemsSource, la zone de liste (ce qui est visible à la fois) obtient ses éléments définis. Cependant, si je vais voir le ListBox, les mises à jour semblent s'arrêter à ce point.

Je peux ensuite supprimer un élément de la collection m_VariableList et il ne disparaît pas du contrôle ListBox. De même, si j'en ajoute un, il n'apparaît pas.

Ce qui donne?

+1

Veuillez publier le code que vous utilisez pour lier ItemSource à m_VariableList. – micahtan

Répondre

18

Votre m_VariableList implémente-t-il INotifyCollectionChanged? Si ce n'est pas une ObservableCollection, les modifications apportées à son contenu ne seront pas reflétées automatiquement dans l'interface utilisateur.

+0

Il s'agit d'une BindingList , qui selon Rocky (http://forums.lhotka.net/forums/thread/17402.aspx) fonctionne à la fois avec WPF et WinForms, alors que INotifyCollectionChanged est uniquement pour WPF. –

+0

S'il implémente IBindingList alors il fonctionnera tout de même. Il se passe quelque chose d'autre qui ne ressort pas de ce que vous avez décrit, car cela fonctionnera. – rmoore

+0

Il s'avère que l'implémentation sous-jacente avait changé (à mon insu) et que IBindingList n'était plus implémenté quand je pensais que c'était le cas. Morale: Vérifiez vos (mes) hypothèses. –

8

Le problème ne réside pas dans le code XAML que vous avez fourni. J'ai utilisé le même XAML avec succès dans une application de test; Cependant, j'ai été capable de répliquer le problème que vous rencontrez en ré-instanciant la variable m_VariableList. Lorsque le m_VariableList reçoit une nouvelle instance ou pointe vers un nouvel objet, il n'est pas reflété dans le ListBox, car le contrôle a sa propre référence aux données

Ce n'est peut-être pas la cause de votre problème, mais je vous recommande de regarder par-dessus votre code-behind pour vous assurer que la variable n'est pas ré-instanciée.

+0

Merci, Tony. Je suis allé spelunking pour essayer de comprendre où la collection a pu être ré-instanciée quand j'ai trouvé que la classe de base avait changé. –

Questions connexes