这是一些XAML
<HierarchicalDataTemplate DataType="{x:Type data:FolderEntity}"
ItemsSource="{Binding Path=FolderEntities,UpdateSourceTrigger=PropertyChanged}">
<Label Content="{Binding FolderName}"/>
</HierarchicalDataTemplate>
<TreeView/>
data:FolderEntity是一个LINQ to SQL数据类,它实现了INotifyPropertyChanging和INotifyPropertyChanged接口。
我的问题是,当我更改FolderEntities属性时,绑定不会更新。如果我更改FolderName属性,则与该项对应的树节点将更改,但FolderEntities的集合将不会更改。
我在考虑WPF检查集合引用是否已更改,或者ItemsSource对象必须是ObservableCollection`1才能使其生效?
非常感谢有关此事的任何意见。
答案 0 :(得分:3)
是的,底层集合(FolderEntities)需要为ObservableCollection<T>
,以便HierarchicalDataTemplate通知更改。要么是那个,要么是实现INotifyCollectionChanged的集合。
答案 1 :(得分:2)
这就是我开始工作的方式,谢谢马特!
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 );
}
然后我将该基类专门用于我正在使用的任何数据类。
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 );
}
}
稍微修改过的XAML,效果很好!对Current的集合或属性的更改会相应地更新TreeView。
<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>
答案 2 :(得分:0)
您绑定的是属性,PropertyChanged(来自INotifyPropertyChanged)仅在设置属性时被调用,例如FolderEntities = aNewValue;
绑定引擎不知道集合中发生的任何更改。