代码之家  ›  专栏  ›  技术社区  ›  Perrin Larson

WPF:“ListView。“Loaded”事件期间,“ItemsSource”属性为null

  •  3
  • Perrin Larson  · 技术社区  · 9 年前

    基本上,我在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 为null,即使我将其绑定到窗口的 OpenItems 属性。我还检查了以确保在调用事件处理程序时该属性当前未设置为null。

    因此,我的问题是,如何确保在列表视图全部设置并附加到其ItemsSource后调用我的事件?我需要处理其他事件吗?或者我需要做一些真正黑客和丑陋的事情,比如启动一个线程,在后台不断检查属性,等待它不为null,然后设置组,然后退出?或者我应该使用一个完全不同的简单而漂亮的解决方案?

    提前谢谢。

    1 回复  |  直到 9 年前
        1
  •  4
  •   XAMlMAX    9 年前

    如果您通过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 ItemsSource="{Binding Source={StaticResource items}}">