在HierarchicalDataTemplate的ItemSource中使用转换器时出现NullReferenceException

时间:2014-07-09 13:12:30

标签: wpf sorting treeview

我有一个包含TreeViewItems的树视图。这些TreeViewItems可能包含子项,这些子项在其Items中是TreeViewItems。我希望所有项目按字母顺序排序在根级别以及所有子级别(我的实现中有0或1)。

树视图的配置如下:

<controls:TreeViewEx Name="m_tvLeft" 
                     ItemsSource="{Binding LeftColumnItems, Converter={x:Static cv:AlphabeticListSortConverter.Instance}, ConverterParameter=Header}"
                     SelectionChanged="OnTvLeftSelectionChanged"
                     MouseDoubleClick="OnTvLeftItemMouseDoubleClick">
   <controls:TreeViewEx.Resources>
      <Style TargetType="controls:TreeViewExItem">
         <Setter Property="FontSize" Value="11"/>
      </Style>
   </controls:TreeViewEx.Resources>
   <controls:TreeViewEx.ItemContainerStyle>
      <Style TargetType="controls:TreeViewExItem">
         <Setter Property="IsExpanded" Value="{Binding IsExpanded}" />
      </Style>
   </controls:TreeViewEx.ItemContainerStyle>
   <controls:TreeViewEx.ItemTemplate>
      <!-- Template for root fields -->
      <HierarchicalDataTemplate ItemsSource="{Binding Items, Converter={x:Static cv:AlphabeticListSortConverter.Instance}, ConverterParameter=Header}">
         <TextBlock Text="{Binding Header}"  Tag="{Binding}" />
         <!-- Template for child fields -->
         <HierarchicalDataTemplate.ItemTemplate>
            <DataTemplate>
               <TextBlock Text="{Binding Header}" Tag="{Binding}" />
            </DataTemplate>
         </HierarchicalDataTemplate.ItemTemplate>
      </HierarchicalDataTemplate>
   </controls:TreeViewEx.ItemTemplate>
</controls:TreeViewEx>

绑定在此属性上完成:

public ObservableCollection<TreeViewItem> LeftColumnItems { get; private set; }

正如这样填充叶子项:

TreeViewItem newItem = new TreeViewItem {
                            Header = newColInfo.Name,
                            Tag = newColInfo
                        };

对于有孩子的分组项目是这样的:

TreeViewItem newGroupItem = new TreeViewItem {
                    Header = columnGroup.GroupName,
                    IsExpanded = columnGroup.IsExpanded
                };

转换器实现:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
   IList collection = value as IList;
   if (collection == null) {
      throw new NotSupportedException(string.Format("The value must be of type IList. Type was {0}", value == null ? "NULL" : value.GetType().ToString()));
   }
   if (parameter == null) {
      throw new NotSupportedException("The parameter must be not NULL.");
   }

   ListCollectionView view = new ListCollectionView(collection);
   SortDescription sort = new SortDescription(parameter.ToString(), ListSortDirection.Ascending);
   view.SortDescriptions.Add(sort);

   return view;
}

问题:即使我身边的任何对象都不为空,也会在此处view.SortDescriptions.Add(sort);抛出NullReferenceException。如果我只将转换器添加到树视图的ItemSource中,则不会发生这种情况,但是,子节点没有排序。

我不明白这个NullReferenceException的来源,因为我只对具有Header属性值设置的TreeViewItem进行操作。

你明白发生了什么吗?

1 个答案:

答案 0 :(得分:2)

所有馆藏都有默认CollectionView。对于实现IList的所有集合,ListCollectionView对象是默认的视图对象。要获取默认视图,请使用GetDefaultView方法。

ListCollectionView继承了实现CollectionView的{​​{1}},因此将ICollectionView检索任何集合的视图并应用排序,过滤等更安全。

我不确定其余的实现,但使用ICollectionView你可以有更多的通用排序

例如

ICollectionView

如果在此之后你收到 ICollectionView view = CollectionViewSource.GetDefaultView(collection); SortDescription sort = new SortDescription(parameter.ToString(), ListSortDirection.Ascending); view.SortDescriptions.Add(sort); 为null,那么检查变量集合是否实际上是一个集合。

更多信息

ListCollectionView

How to: Get the Default View of a Data Collection