基本上,我在 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>
这使您可以进行排序、分组和过滤。
您必须将此标记添加到 UserControl
或 Window
的顶部:
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/