WPF:' ListView.ItemsSource'在“已加载”期间,属性为空事件

时间:2017-08-10 15:08:39

标签: c# wpf xaml data-binding

基本上,我在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,然后设置组,然后退出?或许我应该使用一个完全不同的简单而美观的解决方案?

提前致谢。

1 个答案:

答案 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>  

这使您可以进行排序,分组和过滤 您必须将此标记添加到UserControlWindow

的顶部
xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"  

然后在ListView中使用它:

<ListView ItemsSource="{Binding Source={StaticResource items}}">