WPFのTreeViewは、ルート・ノードを更新しないのObservableCollectionにバインド
-
22-09-2019 - |
質問
申し訳ありません - 私の質問は、この1 のとほとんど同じですが、それは実行可能な答えを受けなかったので、私は他の誰かが、いくつかの新鮮なアイデアを持っていることを期待しています。
私は、単一のタイプの階層にバインドされているWPFのTreeViewを持っています
public class Entity
{
public string Title { get; set; }
public ObservableCollection<Entity> Children { get; set; }
}
Entityクラスの実装はINotifyPropertyChangedのが、私は明確にするため、このコードを省略しています。
ツリービューはのObservableCollection <エンティティ>に結合され、各エンティティインスタンスは、その子のプロパティを介して含まれるエンティティインスタンスのセットを公開します:
<TreeView ItemsSource="{Binding Path=Entities}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:Entity}" ItemsSource="{Binding Path=Children}">
<TextBlock Text="{Binding Path=Title}" />
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
最初のTreeViewバインド予想通り、正しくマルチレベルの階層が表示されます。子供のコレクションの一つの会員がプログラムに変更された場合も、変更が正しくツリービューに反映されます。
しかし、歯根部材レベルのObservableCollection <エンティティ>のメンバーシップには、ツリービューに反映されていない変更します。
任意の提案をいただければ幸いです。
おかげで、 ティム
解決
は私の最初の推測では、ルートノードに対して次のようなものを持っているということです
public ObservableCollection<Entity> Entities
{
get;
set;
}
代わりに何かをするの次に、[良い]以下のように:
Entities.Clear();
foreach (var item in someSetOfItems)
Entities.Add(item);
あなたはこのような何か[悪い]を行っています:
Entities = new ObservableCollection<Entity>(someSetOfItems);
あなたはエンティティのプロパティreadonly
のバッキングフィールドを作ることによって、問題を追跡することができる必要があります:
private readonly ObservableCollection<Entity> _entities
= new ObservableCollection<Entity>();
public ObservableCollection<Entity> Entities
{
get
{
return _entities;
}
}
他のヒント
さらなる説明、答えが来るまでに長い時間が、私は信じて、あなたは行うとXAMLで、その後、あなたがでバインディングをやり直す必要がありますので、あなたは、バインディングを破るプロパティに新しいオブジェクト割り当てコードに結合それを動作させるためのコード。したがって、読み取り専用のバッキングフィールドを持つソリューション。そのようにやっている場合、あなたは新しいのObservableCollectionを割り当てることはできません、あなたはバッキングフィールドに新しいオブジェクトを割り当てることにより、結合を壊すことはありません。