基本上,我在XAML中设置了一个列表视图,如下所示:
<ListView Margin="0" Name="OpenItemsListView"
ItemTemplate="{StaticResource DataItemListItemTemplate}"
ItemsSource="{Binding Path=OpenItems, Mode=OneWay}"
Loaded="OpenItemsListView_Loaded"/>
事件处理程序OpenItemsListView_Loaded
如下所示:
private void OpenItemsListView_Loaded(object sender, RoutedEventArgs e) {
CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(((ListView)sender).ItemsSource);
view.GroupDescriptions.Add(new PropertyGroupDescription(nameof(DataItem.ItemTypeGroup)));
}
我的问题:我在该方法的第一行得到一个空引用异常,因为sender.ItemsSource
为空,即使我将它绑定到XAML列表中的窗口OpenItems
属性查看声明。我还检查确保在调用事件处理程序时该属性当前未设置为null。
所以,我的问题是,如何在列表视图全部设置并附加到其ItemsSource之后确定我的事件被调用?我需要处理不同的事件吗?或者我是否需要做一些非常hacky和丑陋的事情,比如启动一个在后台检查属性的线程,等待它不为null,然后设置组,然后退出?或许我应该使用一个完全不同的简单而美观的解决方案?
提前致谢。
答案 0 :(得分:3)
如果您通过XAML分配集合,所有这些都可以消失:
<CollectionViewSource Source="{Binding OpenItems}" x:Key="items">
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="yourPropertyHere"/>
</CollectionViewSource.GroupDescriptions>
<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="propertyHere" />
</CollectionViewSource.SortDescriptions>
<CollectionViewSource.LiveFilteringProperties>
propertyNameHere
</CollectionViewSource.LiveFilteringProperties>
</CollectionViewSource>
这使您可以进行排序,分组和过滤
您必须将此标记添加到UserControl
或Window
:
xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
然后在ListView中使用它:
<ListView ItemsSource="{Binding Source={StaticResource items}}">