WPF HierarchicalDataTemplate不会更改属性更改时的ItemsSource

时间:2008-12-29 23:43:10

标签: wpf data-binding treeview

这是一些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才能使其生效?

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

3 个答案:

答案 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)

马特是对的。要使数据绑定引擎收到 更改集合的通知,需要绑定到ObservableCollection。

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