我有一个包含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进行操作。
你明白发生了什么吗?
答案 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,那么检查变量集合是否实际上是一个集合。
更多信息