WPF 分层数据模板在属性更改时不会更新 ItemsSource

4

以下是一些 XAML 代码

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

data:FolderEntity是一个实现了INotifyPropertyChanging和INotifyPropertyChanged接口的LINQ to SQL数据类。

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

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

非常感谢任何关于此事的意见。

3个回答

3

是的,底层集合(FolderEntities)需要是ObservableCollection<T>,这样才能通知HierarchicalDataTemplate进行更改。或者使用实现INotifyCollectionChanged接口的集合。


2

这是我让它工作的方法,谢谢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 );
}

然后我将基类专门化为我当前使用的任何数据类。
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,现在它运行得很好!对当前的集合或属性进行更改会相应地更新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>

0

Matt是正确的。为了使数据绑定引擎能够通知集合内部的更改,它需要绑定到ObservableCollection。

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


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

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