WPF TreeView привязан к ObservableCollection не обновляет корневые узлы

извините-мой вопрос почти идентичен этот но поскольку он не получил жизнеспособного ответа, я надеюсь, что у кого-то еще есть свежие идеи.

у меня есть WPF TreeView, который привязан к иерархии одного типа:

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

класс Entity реализует INotifyPropertyChanged, но я опустил этот код для ясности.

TreeView привязан к 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 связывается как ожидалось и правильно отображает многоуровневую иерархию. Кроме того, при программном изменении членства в одной из дочерних коллекций изменения правильно отражаются в TreeView.

однако изменения в членстве на уровне корневого члена ObservableCollection не отражаются в TreeView.

любые предложения будьте благодарны.

спасибо, Тим!--5-->

2 ответов


мое первоначальное предположение, что у вас есть что-то вроде следующего для корневого узла:

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, а затем в коде назначаете новый объект свойству, вы нарушаете привязку, поэтому вам придется повторить привязку в коде, чтобы она работала. Следовательно, решение с полем поддержки readonly. При этом вы не сможете назначить новую коллекцию ObservableCollection и не нарушите привязку, назначив новый объект для резервного поля.