【问题标题】:WPF TreeView bound to ObservableCollection not updating root nodesWPF TreeView 绑定到 ObservableCollection 不更新根节点
【发布时间】:2010-01-26 08:47:44
【问题描述】:

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

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

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

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

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

任何建议将不胜感激。

谢谢, 蒂姆

【问题讨论】:

    标签: wpf binding treeview observablecollection root-node


    【解决方案1】:

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

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

    然后,而不是做一些 [good] 像下面这样:

    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;
        }
    }
    

    【讨论】:

    • @Mike 在 [Bad] 示例中,他正在创建一个新实体,从而破坏了与原始实体的绑定。在 [good] 示例中,他只是清除并向其中添加项目,但保留原始集合。
    • 优秀的例子,帮助我完成了我的 Directory Tree TreeView
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-17
      • 1970-01-01
      相关资源
      最近更新 更多