2009-12-14 264 views
1

我正在使用WPF TreeView控件,我已经绑定到基于ObservableCollections的简单树结构。这里的XAML:WPF - 绑定treeview不更新根项目


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

The cats appear, but not the lizards

任何想法?

+0

您使用的是什么observableCollection,这一个http://msdn.microsoft.com/en-us/library/ms668604.aspx?在上面的代码中看起来像一个非泛型版本,你是否推出了自己的? –

+0

这是我的坏 - 由于尖括号没有显示类型参数。是的,我正在使用标准的通用ObservableCollection。 –

+0

你有没有找到解决这个问题的办法?我有完全相同的问题,并希望您可以提供任何指导。谢谢。 –

回答

3

您正在设置ItemsSource = root,这恰好实现了IEnumerable但不在其中并且本身是可观察的。即使您有一个可观察的Children属性,但这并不是TreeView绑定的内容,所以TreeView没有任何方法来监听通过Children属性发生的更改。

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

2

如果'root'是您的树视图将更新的ObservableCollection。是'根'一个可观察的集合,还是根是一个可观察集合中的节点?看到你的项目源的绑定将有助于回答这个问题。因为您在代码中指定它可能只是将其设置为单个元素,而不是集合

+0

我已经用相关的细节更新了问题 - “root”只是一个像所有其他节点一样的节点。它不会在TreeView本身显示,但没关系。 如果我创建一个可观察的NodeCollection并将其用作根,它没有任何区别。 –