【问题标题】:WPF HierarchicalDataTemplate doesn't update ItemsSource on property changedWPF HierarchicalDataTemplate 不会在属性更改时更新 ItemsSource
【发布时间】:2008-12-29 23:43:10
【问题描述】:

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

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

【问题讨论】:

    标签: wpf data-binding treeview


    【解决方案1】:

    是的,底层集合 (FolderEntities) 需要是 ObservableCollection&lt;T&gt; 才能通知 HierarchicalDataTemplate 更改。或者是实现INotifyCollectionChanged的集合。

    【讨论】:

      【解决方案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>
      

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 我确实确保该对象发送了一个通知,指出属性 FolderEntities 已更改。但是,它没有用。这让我感到惊讶,因为我告诉数据绑定引擎属性已更改,但仍然没有发生更新。
        猜你喜欢
        • 2012-06-22
        • 2014-01-26
        • 1970-01-01
        • 2012-04-10
        • 1970-01-01
        • 2021-09-26
        • 1970-01-01
        • 1970-01-01
        • 2019-11-25
        相关资源
        最近更新 更多