ItemsSource + Converter + Treeview が更新されない
-
22-08-2019 - |
質問
これはかなり複雑なので、誰かが私を助けてくれるよう十分に明確にできれば幸いです。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 は更新されません。デバッグすると、Add アクションと追加された項目で CollectionChanged が起動していることがわかります。また、CollectionChanged イベントは null ではないため、UI がそれを監視していることがわかります。ただし、項目が追加されたときにコンバータは実行されません。
これは、Iperson オブジェクトを保持する List の Add メソッドです。
public void Add(T item)
{
list.Add(item);
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item));
}
何らかの方法でデータバインディングを壊しているのでしょうか?
他にどのようなことを確認できますか?
コンバーターは、人物リストの各項目を調べて、どのようなプロジェクトに取り組んでいるかを把握し、プロジェクト名を出力リストに追加します。
解決
コンバータは、コレクションを格納するプロパティに適用されます。したがって、コレクション インスタンス自体が変更された場合にのみ呼び出されます (コレクション内の項目が変更された場合ではありません)。これを回避する 1 つの方法は、コレクションを更新するときにコレクションを無効にすることです。
コレクション プロパティを無効にしてコンバータ コードを再度実行する最も簡単な方法は、次のとおりです。 null
コレクションを削除して再割り当てします。別の方法は、 BindingExpression
(経由 BindingOperations
)そして電話してください UpdateTarget
. 。最後に、代わりに、 CollectionView
(またはそのサブクラス) を呼び出します Refresh
その上で。
そしてもしあなたが 本当に 問題をきれいに修正したい場合は、独自の実装にバインドできます。 ICollectionView
これによりフィルタリングが行われ、必要に応じてイベントが発生します。