2009-06-16 12 views
9

Ich habe, was ich glaube, sollte einfache Zwei-Wege-Datenbindung in WPF-Setup, aber die Listbox (Ziel) wird nicht aktualisiert, wie die Sammlung ändert.WPF ListBox nicht mit der ItemsSource

Ich gründe dieses Itemssource des ListBox programmatisch:

lstVariable_Selected.ItemsSource = m_VariableList; 

Und die ListBox erklärt sich wie folgt:

  <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> 

Als ich anfangs die Itemssource festgelegt, die List-Box (was nicht ist zu der Zeit sichtbar) bekommt seine Gegenstände eingestellt. Wenn ich jedoch die ListBox betrachte, scheinen Updates an diesem Punkt zu stoppen.

Ich kann dann ein Element aus der m_VariableList-Auflistung entfernen, und es verschwindet nicht aus der ListBox. Ebenso, wenn ich eins hinzufüge, erscheint es nicht.

Was gibt?

+1

Geben Sie den Code ein, mit dem Sie ItemSource an m_VariableList binden. – micahtan

Antwort

18

Ist Ihre m_VariableList Implementierung INotifyCollectionChanged? Wenn es sich nicht um eine ObservableCollection handelt, werden Änderungen an deren Inhalt nicht automatisch in der Benutzeroberfläche angezeigt.

+0

Es ist eine BindingList , die nach Rocky (http://forums.lhotka.net/forums/thread/17402.aspx) mit WPF und WinForms funktioniert, während INotifyCollectionChanged nur WPF ist. –

+0

Wenn es IBindingList implementiert, wird es genauso funktionieren. Es gibt noch etwas anderes, das aus dem, was du beschrieben hast, nicht ersichtlich ist, denn das wird funktionieren. – rmoore

+0

Es stellte sich heraus, dass sich die zugrunde liegende Implementierung geändert hatte (ohne dass mir jemand davon wusste) und dass sie IBindingList nicht mehr implementierte, als ich dachte, dass dies der Fall war. Moral: Überprüfen Sie Ihre (meine) Annahmen. –

8

Das Problem liegt nicht in dem von Ihnen bereitgestellten XAML. Ich habe das gleiche XAML erfolgreich in einer Testanwendung verwendet; Ich war jedoch in der Lage, das aufgetretene Problem zu replizieren, indem ich die Variable m_VariableList erneut instanziierte.

Wenn die m_VariableList eine neue Instanz erhält oder auf ein neues Objekt verweist, wird sie nicht in der ListBox angezeigt, da das Steuerelement über eine eigene Referenz auf die Daten verfügt. Dies ist möglicherweise nicht die Ursache für Ihr Problem, aber ich würde Ihnen empfehlen, über Ihren Code-Behind zu schauen, um sicherzustellen, dass die Variable nicht erneut instanziiert wird.

+0

Danke, Tony. Ich ging spelunking, um herauszufinden, wo die Sammlung möglicherweise instanziiert wurde, als ich feststellte, dass sich die Basisklasse geändert hatte. –