我正在使用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之前添加了蜥蜴,则它们会显示出来,但是如果之后添加它们,则不会显示。



有任何想法吗?

最佳答案

您正在设置ItemsSource = root,它恰好实现IEnumerable,但本身并不可见。即使您具有可观察到的Children属性,也不是将TreeView绑定到的属性,因此TreeView没有任何方法可以监听通过Children属性发生的更改。

我将从Node类中完全删除IEnumerable。然后设置treeView.ItemsSource = root.Children;

关于c# - WPF-绑定(bind)树 View 不更新根项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1898463/

10-11 20:13