これはかなり複雑です。うまくいけば、誰かが私を助けてくれるように、これを十分に明確にすることができます。Manager と呼べるオブジェクトがあります。Manager には、彼が管理する人々のコレクションがあり、人々はすべて IPerson を実装していますが、さまざまな種類の人々がさまざまなプロパティを持っています。このマネージャーをツリーで表示し、マネージャー ノードの下に、彼が管理しているすべてのプロジェクトを表示したいと考えています。これは、彼が管理する人々から判断できます。
したがって、コンバーターを使用して人をプロジェクトのリストに変換する計画です。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>
私の Person クラスは INotifyPropertyChanged を実装し、人々を保持するリストは INotifyCollectionChanged を実装します。このコードは、ツリービューの ItemsSource を設定するとうまく機能し、マネージャーはプロジェクトのリストと共に表示されます。
ただし、人のリストに新しい人を追加しても、TreeView は更新されません。デバッグすると、追加アクションと追加された項目で CollectionChanged が起動していることがわかります。また、CollectionChanged イベントは null ではないため、UI が監視していることがわかります。ただし、アイテムが追加されたときにコンバーターは実行されません。
IPerson オブジェクトを保持する List の Add メソッドを次に示します。
public void Add(T item)
{
list.Add(item);
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item));
}
どういうわけかデータバインディングを壊していますか?
他にどのようなことを確認できますか?
コンバーターは、人物リストの各アイテムを見て、彼らが取り組んでいるプロジェクトを把握し、プロジェクト名を出力リストに追加します。