WPF TreeView绑定到ObservableCollection后无法更新根节点

12

对不起 - 我的问题几乎与这个问题相同,但由于它没有得到可行的答案,我希望其他人有些新的想法。

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

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

为了清晰明了,我省略了实现INotifyPropertyChanged的代码。

TreeView绑定到一个ObservableCollection<Entity>,每个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<Entity>的成员资格进行更改不会在TreeView中反映出来。

欢迎提供建议。

谢谢, Tim

2个回答

25

我的初步猜测是您的根节点有类似以下内容:

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

那么,不要像下面这样做一些[好的]事情:

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

你正在做类似于这样的[错误]操作:

Entities = new ObservableCollection<Entity>(someSetOfItems);

通过将Entities属性的后备字段设置为readonly,您应该能够找到问题的原因:

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

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

5
在“不好的”示例中,他正在创建一个新实体,因此打破了与原始实体的绑定。在“好的”示例中,他只是清除并向其添加项目,但保留了原始集合。 - Ingó Vals
优秀的例子,帮助我处理目录树 TreeView。 - riciloma

2
进一步解释,答案需要很长时间才能得出,但我相信如果你在XAML中进行绑定,然后在代码中将一个新对象分配给属性,你就会打破绑定,所以你必须在代码中重新做绑定才能使其工作。因此,使用只读的后备字段的解决方案。如果像这样做,您将无法分配一个新的ObservableCollection,并且通过将一个新对象分配给后备字段,您不会打破绑定。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接