WPF - Связанное дерево не обновляет корневые элементы
Я использую элемент управления WPF TreeView, который привязан к простой древовидной структуре на основе ObservableCollections. Вот XAML:
<TreeView Name="tree" Grid.Row="0">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Path=Children}">
<TextBlock Text="{Binding Path=Text}"/>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
И древовидная структура:
public class Node : IEnumerable {
private string text;
private ObservableCollection<Node> children;
public string Text { get { return text; } }
public ObservableCollection<Node> Children { get { return children; } }
public Node(string text, params string[] items){
this.text = text;
children = new ObservableCollection<Node>();
foreach (string item in items)
children.Add(new Node(item));
}
public IEnumerator GetEnumerator() {
for (int i = 0; i < children.Count; i++)
yield return children[i];
}
}
Я установил ItemsSource этого дерева в качестве корня моей древовидной структуры, и его дочерние элементы становятся элементами корневого уровня в дереве (так, как я хочу):
private Node root;
root = new Node("Animals");
for(int i=0;i<3;i++)
root.Children.Add(new Node("Mammals", "Dogs", "Bears"));
tree.ItemsSource = root;
Я могу добавить новых дочерних элементов в различные некорневые узлы моей древовидной структуры, и они появятся в TreeView именно там, где и должны.
root.Children[0].Children.Add(new Node("Cats", "Lions", "Tigers"));
Но если я добавлю дочерний элемент в корневой узел:
root.Children.Add(new Node("Lizards", "Skinks", "Geckos"));
Элемент не появляется, и ничего из того, что я пробовал (например, установил для ItemSource значение null и затем снова), не вызвало его появление.
Если я добавлю ящериц перед настройкой ItemsSource, они появятся, но не тогда, когда я добавлю их позже.
Есть идеи?
2 ответа
Вы устанавливаете ItemsSource = root, который реализует IEnumerable, но сам по себе не наблюдается. Даже если у вас есть свойство Children, которое можно наблюдать, это не то, к чему вы привязываете TreeView, поэтому TreeView не может прослушивать изменения, которые происходят через свойство Children.
Я бы вообще отбросил IEnumerable из класса Node. Затем установите treeView.ItemsSource = root.Children;
Если root является ObservableCollection, ваш древовидный список обновится. Является ли 'root' наблюдаемой коллекцией или root является узлом, который находится в наблюдаемой коллекции? видя вашу привязку к источнику предметов, поможет ответить на этот вопрос. так как вы назначаете его в коде, вы можете просто установить его как отдельный элемент, а не коллекцию