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 и не нарушите привязку, назначив новый объект для резервного поля.