4

这是一些 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 才能工作?

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

4

3 回答 3

3

是的,底层集合 (FolderEntities) 需要作为ObservableCollection<T>HierarchicalDataTemplate 的一个,才能收到更改通知。或者是实现INotifyCollectionChanged的​​集合。

于 2008-12-29T23:51:20.050 回答
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>
于 2008-12-30T10:42:53.870 回答
0

马特是正确的。要让数据绑定引擎收到集合内的更改通知,它需要绑定到 ObservableCollection。

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

于 2008-12-30T01:16:50.550 回答