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