c# - WPF: 'ListView.ItemsSource' 属性在 'Loaded' 事件期间为空

标签 c# wpf xaml data-binding

基本上,我在 XAML 中设置了一个 ListView ,如下所示:

<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 是空的,即使我将它绑定(bind)到窗口的 OpenItems 属性在 XAML ListView 声明中。我还检查以确保在调用事件处理程序时该属性当前未设置为 null。

所以,我的问题是,如何确保在 ListView 全部设置并附加到其 ItemsSource 之后调用我的事件?我需要处理其他事件吗?或者我是否需要做一些非常棘手和丑陋的事情,比如启动一个线程,在后台不断检查属性以等待它不为空,然后设置组,然后退出?或者我应该使用一个完全不同的简单而漂亮的解决方案?

提前致谢。

最佳答案

如果您通过 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}}">

关于c# - WPF: 'ListView.ItemsSource' 属性在 'Loaded' 事件期间为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45617444/

相关文章:

c# - ASP.Net C# - 根据条件设置 MySQL 查询和参数

c# - 如何在 .Net 中读取 .ETL 文件?

c# - 如何将 DBNull 检查到 linq 或 int32 中?

wpf - 为什么我的 TextBlock/TextBox 不应用来自基本样式的值?

c# - 一种根据另一种风格激活的风格?

c# - WPF 与属性索引绑定(bind)?

c# - 如何更改所选ListView项目的颜色[WP8.1]

c# - 在颁发者名称与特定值匹配的集合中查找 X509 证书

c# - 将 google 凭据用于生产应用程序的最佳方式是什么?

c# - 在 WPF 中使用 DataTrigger 设置 Grid.Column