绑定到ObservableCollection的WPF TreeView不更新根节点

时间:2010-01-26 08:47:44

标签: wpf binding treeview observablecollection root-node

抱歉 - 我的问题几乎与this one相同,但由于没有得到可行的答案,我希望其他人有一些新的想法。

我有一个绑定到单一类型层次结构的WPF TreeView:

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

Entity类实现了INotifyPropertyChanged,但为了清楚起见,我省略了这段代码。

TreeView绑定到ObservableCollection&lt; Entity&gt;每个Entity实例通过其Children属性公开一组包含的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按预期绑定并正确显示多级层次结构。此外,当以编程方式修改其中一个Children集合的成员资格时,更改将正确反映在TreeView中。

但是,对根成员级别的成员资格的更改ObservableCollection&lt; Entity&gt;没有反映在TreeView中。

任何建议都将不胜感激。

谢谢, 添

2 个答案:

答案 0 :(得分:21)

我最初的猜测是你对根节点有如下内容:

public ObservableCollection<Entity> Entities
{
    get;
    set;
}

然后,不要像以下那样做[好]:

Entities.Clear();
foreach (var item in someSetOfItems)
    Entities.Add(item);

你这样做的事情很糟糕:

Entities = new ObservableCollection<Entity>(someSetOfItems);

您应该能够通过制作实体属性readonly的支持字段来追踪问题:

private readonly ObservableCollection<Entity> _entities
    = new ObservableCollection<Entity>();

public ObservableCollection<Entity> Entities
{
    get
    {
        return _entities;
    }
}

答案 1 :(得分:2)

进一步的解释,很长一段时间来回答,但我相信如果你在XAML中进行绑定,然后在代码中为属性分配一个新对象就会破坏绑定,所以你必须重做绑定代码让它工作。因此,具有只读后备字段的解决方案。如果这样做,您将无法分配新的ObservableCollection,并且您不会通过为支持字段分配新对象来破坏绑定。