Просмотр дерева WPF, привязанный к ObservableCollection, не обновляет корневые узлы

StackOverflow https://stackoverflow.com/questions/2138281

Вопрос

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

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

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

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

TreeView привязан к ObservableCollection<Entity> и каждый экземпляр объекта предоставляет набор содержащихся в нем экземпляров объекта через свое дочернее свойство:

<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 корневого уровня элемента<Entity> не отражаются в TreeView.

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

Спасибо, Тим

Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top