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")); 

Элемент не отображается, и ничто из того, что я пробовал (например, установка для ItemsSource значения null и затем обратно), не приводило к его появлению.

Если я добавлю ящериц до установки ItemsSource, они появятся, но не будут, если я добавлю их потом.

Появляются кошки, но не ящерицы

Любые идеи?


person Jivlain    schedule 14.12.2009    source источник
comment
какой observableCollection вы используете, этот msdn.microsoft.com/en-us/ library / ms668604.aspx? потому что в вашем коде выше, который выглядит как неуниверсальная версия, вы накатили свою собственную?   -  person Aran Mulholland    schedule 14.12.2009
comment
Это было моей бедой - параметр типа не отображался из-за угловых скобок. Да, я использую стандартный общий набор ObservableCollection.   -  person Jivlain    schedule 14.12.2009
comment
Вы когда-нибудь находили решение этой проблемы? У меня точно такая же проблема, и я буду признателен за любые рекомендации, которые вы можете предложить. Спасибо.   -  person Tim Coulter    schedule 26.01.2010
comment
Ответ Джоша Эйнштейна устранил мою проблему - установил для ItemsSource значение root.Children. Не знаю, решит ли это вашу проблему.   -  person Jivlain    schedule 12.02.2010


Ответы (2)


Вы устанавливаете ItemsSource = root, который реализует IEnumerable, но сам по себе не является наблюдаемым. Несмотря на то, что у вас есть наблюдаемое свойство Children, это не то, к чему вы привязываете TreeView, поэтому TreeView не имеет возможности прослушивать изменения, происходящие через свойство Children.

Я бы вообще отказался от IEnumerable из класса Node. Затем установите treeView.ItemsSource = root.Children;

person Josh    schedule 26.01.2010

если 'root' - это ObservableCollection, ваше древовидное представление обновится. 'root' - это наблюдаемая коллекция или root - это узел, который находится в наблюдаемой коллекции? просмотр вашей привязки к источнику элементов поможет ответить на этот вопрос. поскольку вы назначаете его в коде, вы можете просто установить его как отдельный элемент, а не коллекцию

person Aran Mulholland    schedule 14.12.2009
comment
Я обновил вопрос соответствующими деталями - root - это просто узел, как и все остальные. Он не отображается в самом TreeView, но это нормально. Если я создаю наблюдаемую коллекцию NodeCollection и использую ее в качестве корня, это не имеет никакого значения. - person Jivlain; 14.12.2009