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

绑定到ObservableCollection的WPF TreeView未更新根节点,wpf,binding,treeview,observablecollection,root-node,Wpf,Binding,Treeview,Observablecollection,Root Node,对不起,我的问题和你的差不多,但因为没有得到一个可行的答案,我希望其他人有一些新的想法 我有一个绑定到单一类型层次结构的WPF树视图: public class Entity { public string Title { get; set; } public ObservableCollection<Entity> Children { get; set; } } 公共类实体 { 公共字符串标题{get;set;} 公共可观测集合子项{get;set;} } E

对不起,我的问题和你的差不多,但因为没有得到一个可行的答案,我希望其他人有一些新的想法

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

public class Entity
{
    public string Title { get; set; }
    public ObservableCollection<Entity> Children { get; set; }
}
公共类实体
{
公共字符串标题{get;set;}
公共可观测集合子项{get;set;}
}
Entity类实现了INotifyPropertyChanged,但为了清晰起见,我省略了这段代码

TreeView绑定到ObservableCollection,每个实体实例通过其子属性公开一组包含的实体实例:

<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按预期绑定并正确显示多级层次结构。此外,当以编程方式修改其中一个子集合的成员资格时,更改将正确反映在TreeView中

但是,对根成员级别ObservableCollection成员身份的更改不会反映在TreeView中

如有任何建议,将不胜感激

谢谢,
Tim

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

public ObservableCollection<Entity> Entities
{
    get;
    set;
}
你在做这样的[坏事]:

Entities = new ObservableCollection<Entity>(someSetOfItems);

进一步解释,答案还需要很长时间,但我相信,如果您在XAML中进行绑定,然后在代码中为属性分配一个新对象,那么您将破坏绑定,因此您必须在代码中重新进行绑定才能使其工作。因此,解决方案使用只读备份字段。如果这样做,您将无法分配新的ObservaleCollection,并且不会通过将新对象分配给backing字段来破坏绑定

@Mike在[Bad]示例中,他创建了一个新实体,从而打破了与原始实体的绑定。在[good]示例中,他只是清理并添加项目,但保留了原始集合
Entities = new ObservableCollection<Entity>(someSetOfItems);
private readonly ObservableCollection<Entity> _entities
    = new ObservableCollection<Entity>();

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