11

申し訳ありませんが、私の質問はこれとほとんど同じですが、実行可能な回答が得られなかったため、他の誰かが新しいアイデアを持っていることを願っています.

単一のタイプの階層にバインドされた WPF TreeView があります。

public class Entity
{
    public string Title { get; set; }
    public ObservableCollection<Entity> Children { get; set; }
}

Entity クラスは INotifyPropertyChanged を実装していますが、わかりやすくするためにこのコードは省略しています。

TreeView は ObservableCollection<Entity> にバインドされ、各 Entity インスタンスは含まれている Entity インスタンスのセットをその Children プロパティを介して公開します。

<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 は期待どおりにバインドされ、複数レベルの階層が正しく表示されます。また、Children コレクションのいずれかのメンバーシップがプログラムによって変更されると、その変更は TreeView に正しく反映されます。

ただし、ルート メンバー レベルの ObservableCollection<Entity> のメンバーシップに対する変更は、TreeView に反映されません。

任意の提案をいただければ幸いです。

ありがとう、ティム

4

2 に答える 2

24

私の最初の推測では、ルート ノードには次のようなものがあると思います。

public ObservableCollection<Entity> Entities
{
    get;
    set;
}

次に、次のような[良い]ことをする代わりに:

Entities.Clear();
foreach (var item in someSetOfItems)
    Entities.Add(item);

あなたは次のような[悪い]ことをしています:

Entities = new ObservableCollection<Entity>(someSetOfItems);

Entities プロパティのバッキング フィールドを作成することで、問題を追跡できるはずですreadonly

private readonly ObservableCollection<Entity> _entities
    = new ObservableCollection<Entity>();

public ObservableCollection<Entity> Entities
{
    get
    {
        return _entities;
    }
}
于 2010-01-26T10:10:36.607 に答える
2

詳細な説明、回答には長い時間がかかりますが、XAMLでバインディングを行い、コードで新しいオブジェクトをプロパティに割り当てると、バインディングが壊れるため、コードでバインディングをやり直す必要があると思います仕事に。したがって、読み取り専用のバッキング フィールドを使用したソリューションです。そのようにすると、新しい ObservableCollection を割り当てることができず、バッキング フィールドに新しいオブジェクトを割り当ててもバインディングが壊れません。

于 2012-03-07T09:46:06.310 に答える