2009-04-01 16 views
3

Dieser ist ziemlich komplex, hoffentlich kann ich das klar genug machen, damit jemand mir helfen kann. Ich habe ein Objekt, nennen wir es einen Manager, der Manager hat eine Sammlung von Leuten, die er verwaltet, die Leute implementieren alle IPerson, aber verschiedene Arten von Menschen haben unterschiedliche Eigenschaften. Ich möchte diesen Manager in einem Baum anzeigen, und unter dem Manager-Knoten möchte ich alle Projekte anzeigen, die er verwaltet, die von den Leuten, die er verwaltet, bestimmt werden können.ItemsSource + Converter + Treeview wird nicht aktualisiert

Also ist der Plan, einen Konverter zu verwenden, um eine Person in eine Liste von Projekten umzuwandeln. Hier ist die XAML:

<HierarchicalDataTemplate DataType="{x:Type ui:Manager}"> 
    <TextBlock Text="{Binding Path=Name}"/> 
    <HierarchicalDataTemplate.ItemTemplate> 
     <DataTemplate> 
        <TextBlock Text="{Binding}"/> 
     </DataTemplate> 
    </HierarchicalDataTemplate.ItemTemplate> 
    <HierarchicalDataTemplate.ItemsSource> 
     <Binding Path="People"> 
      <Binding.Converter> 
       <configUtil:ProjectListConverter/> 
      </Binding.Converter> 
     </Binding> 
    </HierarchicalDataTemplate.ItemsSource> 
</HierarchicalDataTemplate> 

Meine Person-Klasse implementiert INotifyPropertyChanged, und die Liste hält die Menschen implementiert INotifyCollectionChanged.This Code funktioniert gut, wenn ich die treeview Itemssource festgelegt, die Manager sind mit ihrer Liste der Projekte angezeigt.

Wenn ich jedoch eine neue Person zur Personenliste hinzufüge, wird die TreeView nicht aktualisiert. Wenn ich debugge, kann ich sehen, dass die CollectionChanged mit der Aktion Hinzufügen und dem hinzugefügten Element abfeuert. Auch das CollectionChanged-Ereignis ist nicht null, also weiß ich, dass die Benutzeroberfläche es beobachtet. Der Konverter wird jedoch nicht ausgeführt, wenn das Element hinzugefügt wird.

hier ist die Add-Methode für die Liste der Objekte IPerson halten:

public void Add(T item) 
{ 
    list.Add(item); 
    OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item)); 
} 

Bin ich irgendwie die Datenbindung zu brechen?

Welche anderen Dinge kann ich überprüfen?

Der Konverter betrachtet nur jedes Element in der Personenliste und ermittelt, an welchen Projekten sie arbeiten, und fügt den Projektnamen einer Ausgabeliste hinzu.

Antwort

2

Der Konverter wird auf die Eigenschaft angewendet, die die Sammlung speichert. Daher wird es nur aufgerufen, wenn sich die Sammlungsinstanz selbst ändert (nicht, wenn Elemente in der Sammlung geändert werden). Eine Möglichkeit wäre, die Sammlung ungültig zu machen, wenn sie aktualisiert werden soll.

Die einfachste Möglichkeit zum Ungültigmachen der Auflistungseigenschaft und zum erneuten Ausführen des Konvertercodes besteht darin, die Auflistung zu null auszulassen und neu zuzuweisen. Eine andere Möglichkeit ist, die BindingExpression (über BindingOperations) und rufen Sie UpdateTarget. Schließlich könnten Sie stattdessen an eine CollectionView (oder Unterklasse davon) binden und Refresh darauf aufrufen.

Und wenn Sie wirklich das Problem sauber beheben möchten, können Sie Ihre eigene Implementierung von ICollectionView binden, die die Filterung tut und löst Ereignisse wie nötig.

+0

Ich denke zu verstehen, was Sie mir sagen, aber ich bin mir nicht sicher, wie das mit dem hierarchischen DataTemplate zu tun. Wenn ich es richtig verstehe, möchte ich die People-Eigenschaft in eine CollectionView umbrechen und die CollectionView aktualisieren, wenn sich die Collection ändert. Ein Beispielcode wäre eine große Hilfe. – Kelly

+0

Danke für die Hilfe, ich habe es funktioniert, indem ich meine Personenliste in eine ObservableCollection von Projekten eingepackt habe, die das People-Collection-Änderungsereignis abonniert haben und sich selbst aktualisiert haben. – Kelly

Verwandte Themen