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
Мы ценим любые предложения.
Спасибо Тим
2 ответа
Мое первоначальное предположение, что у вас есть что-то вроде следующего для корневого узла:
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;
}
}
Дальнейшее объяснение, долгое время для ответа, но я считаю, что если вы делаете привязку в XAML, а затем в коде присваиваете новый объект свойству, вы нарушаете привязку, поэтому вам придется переделывать привязку в коде для него работать. Отсюда и решение с полем только для чтения. В таком случае вы не сможете назначить новую коллекцию ObservableCollection и не нарушите привязку, назначив новый объект вспомогательному полю.