WPF HierarchycalDataTemplate没有';t更新属性上的ItemsSource已更改
这里有一些XAMLWPF 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> <
<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已更改的通知。然而,它没有起作用。这让我感到惊讶,因为我告诉数据绑定引擎属性已经更改,但仍然没有更新。