WPF HierarchycalDataTemplate没有';t更新属性上的ItemsSource已更改

WPF HierarchycalDataTemplate没有';t更新属性上的ItemsSource已更改,wpf,data-binding,treeview,Wpf,Data Binding,Treeview,这里有一些XAML <HierarchicalDataTemplate DataType="{x:Type data:FolderEntity}" ItemsSource="{Binding Path=FolderEntities,UpdateSourceTrigger=PropertyChanged}"> <Label Content="{Binding FolderName}"/> </HierarchicalDataTemplate> <

这里有一些XAML

<HierarchicalDataTemplate DataType="{x:Type data:FolderEntity}" 
  ItemsSource="{Binding Path=FolderEntities,UpdateSourceTrigger=PropertyChanged}">
  <Label Content="{Binding FolderName}"/>
</HierarchicalDataTemplate>
<TreeView/>

data:FolderEntity是一个LINQ到SQL的数据类,它实现了INotifyPropertyChanged和INotifyPropertyChanged接口

我的问题是,当我更改FolderEntities属性时,绑定不会更新。如果我更改FolderName属性,对应于该项的树节点将更改,但FolderEntities集合不会更改

我认为WPF会检查集合引用是否已更改,或者ItemsSource对象是否必须是ObservableCollection`1才能工作


非常感谢您对此事的任何意见。

是的,底层集合(FolderEntities)需要是一个
可观察集合,以便Hierarchy DataTemplate收到更改通知。或者是实现的集合。

Matt是正确的。要使数据绑定引擎收到集合中更改的通知,它需要绑定到ObservableCollection


您绑定到的是属性,而PropertyChanged(来自INotifyPropertyChanged)仅在设置属性时才被调用,例如
FolderEntities=aNewValue绑定引擎不知道集合中发生的任何更改。

这就是我如何让它工作的,谢谢Matt

public abstract class ObservableHierarchy<T>
{
    public T Current { get; set; }

    public ObservableCollection<ObservableHierarchy<T>> Children { get; set; }

    public ObservableHierarchy( T current, Func<T, IEnumerable<T>> expand )
    {
        this.Current = current;
        this.Children = new ObservableCollection<ObservableHierarchy<T>>();
        foreach ( var item in expand( current ) )
        {
            Children.Add( Create( item ) );
        }
    }

    protected abstract ObservableHierarchy<T> Create( T item );
}
公共抽象类可观察层次结构
{
公共T当前{get;set;}
公共可观测集合子项{get;set;}
公共观察层次结构(T当前,功能扩展)
{
这个。电流=电流;
this.Children=新的可观察集合();
foreach(扩展中的var项目(当前))
{
添加(创建(项));
}
}
受保护抽象层次结构创建(T项);
}
然后我将基类专门化为我当前使用的任何数据类

public class ObservableFolderHierarchy:
    ObservableHierarchy<FolderEntity>
{
    public ObservableFolderHierarchy( FolderEntity root )
        : base( root, x => x.FolderEntities )
    {
    }

    protected override ObservableHierarchy<FolderEntity> Create( FolderEntity item )
    {
        return new ObservableFolderHierarchy( item );
    }
}
公共类ObservableFolderHierarchy:
明显的等级制度
{
公共ObservableFolderHierarchy(FolderEntity根目录)
:base(根,x=>x.FolderEntities)
{
}
受保护的覆盖可观察层次结构创建(折叠实体项)
{
返回新的ObservableFolderHierarchy(项目);
}
}
稍微修改了XAML,效果非常好!对当前的集合或属性所做的更改会相应地更新树视图

<HierarchicalDataTemplate DataType="{x:Type ui:ObservableFolderHierarchy}"
 ItemsSource="{Binding Children}">
 <StackPanel Orientation="Horizontal">
  <Image Source="/UI/Resources/folder.png" Width="16" Height="16"/>
  <TextBlock Text="{Binding Current.FolderName}"/>
 </StackPanel>
</HierarchicalDataTemplate>

我确实确保该对象发送了属性FolderEntity已更改的通知。然而,它没有起作用。这让我感到惊讶,因为我告诉数据绑定引擎属性已经更改,但仍然没有更新。