C# CollectionViewSource.GetDefaultView仅在设置绑定后返回null

C# CollectionViewSource.GetDefaultView仅在设置绑定后返回null,c#,.net,wpf,C#,.net,Wpf,我在WPF用户控件的构造函数中有一些代码。基本上,我设置了与XmlDataProvider的绑定(我的数据是动态的)。然后我想将视图上的CustomSort设置为MySorter(实现IComparer) 问题是,如果在SetBinding调用之后直接调用GetDefaultView,则返回null,就好像有一些异步处理正在进行以设置ItemsSource。请注意,如果稍后在按钮单击处理程序中调用相同的GetDefaultView代码,它工作正常,不会返回null,排序机制也工作正常 MyLis

我在WPF用户控件的构造函数中有一些代码。基本上,我设置了与XmlDataProvider的绑定(我的数据是动态的)。然后我想将视图上的CustomSort设置为MySorter(实现IComparer)

问题是,如果在SetBinding调用之后直接调用GetDefaultView,则返回null,就好像有一些异步处理正在进行以设置ItemsSource。请注意,如果稍后在按钮单击处理程序中调用相同的GetDefaultView代码,它工作正常,不会返回null,排序机制也工作正常

MyListBox.SetBinding(ListBox.ItemsSourceProperty, binding);

ListCollectionView view = CollectionViewSource.GetDefaultView(MyListBox.ItemsSource) as ListCollectionView;

view.CustomSort = new MySorter(); // falls over - view is null

我的问题是,为什么在SetBinding之后直接调用GetDefaultView时会返回null,在调用GetDefaultView并获得非null响应之前,是否需要等待一个事件?

是您的
用户。ItemsSource
项集合
?那么视图也可能是一个视图,因为它继承自


CollectionViewSource.GetDefaultView
返回一个
ICollectionView
。仅从
CollectionView
继承的类比从
ListCollectionView
继承的类更多。确保您的演员阵容没有失败,例如,使用以下代码:

var view = CollectionViewSource.GetDefaultView(Users.ItemsSource);
Console.WriteLine(view.GetType());

使用XmlDataProvider时会发生这种情况。当从代码中的对象实例设置DataContext时,GetDefaultView不返回null。但是,当使用XmlDataProvider时,GetDefaultView返回null。我发现这是因为在加载xml之前,它返回null


因此,如果使用“Loaded”事件的事件处理程序方法从调用CollectionViewSource.GetDefaultView,则其工作正常

public MainWindow()
    {
        InitializeComponent();
        this.comboBox1.Loaded += new RoutedEventHandler(ComboBoxLoaded);           
    }

    private void ComboBoxLoaded(object sender, RoutedEventArgs e)
    {
        ListCollectionView view = (ListCollectionView)CollectionViewSource.GetDefaultView(((XmlDataProvider)this.myGrid.DataContext).Data);
        view.SortDescriptions.Add(new SortDescription("Location", ListSortDirection.Ascending));
    }    
您可以在以下链接中找到此示例(在第8阶段下):


了解此代码的位置可能会有所帮助?也许绑定本身在这一点上是空的。我在我原来的帖子中输入了一个错误(现在更正了),对不起。GetDefaultView中的Users.ItemsSource实际上就是在第一行设置了绑定的MyListBox。这就是为什么MyListBox.ItemsSource应该是非空的。我在我原来的帖子中输入了一个错误(现已更正),对不起。GetDefaultView中的Users.ItemsSource实际上就是在第一行设置了绑定的MyListBox。因此,MyListBox.ItemsSource应为非空。在稍后的单击事件处理程序中调用时,强制转换不会失败,因此我认为这不是强制转换问题。谢谢。我的代码(带更正)显示了什么?。按此顺序检查MyListBox.ItemsSource是否为Null,CollectionViewSource.GetDefaultView(MyListBox.ItemsSource)是否为Null。MyListBox.ItemsSource是否为Null。。。但是,它在按钮单击处理程序中是非null的,就好像它从SetBinding调用返回时还没有完成绑定一样?XmlDataProvider中有相当数量的数据,但它仍会在不到一秒钟内填充。请尝试直接从绑定源集合而不是MyListBox获取DefaultView。ItemsSource.CollectionViewSource.GetDefaultView(binding.source)也会返回null,尽管在调试器绑定中查找.Source被设置为my XmlDataProvider,而my XmlDataProvider又似乎被填充(它的文档成员在其InnerXml成员中显示XML)。我们曾看到过“CollectionViewSource.GetDefaultView”会返回“null”的随机情况,但无法理解原因。我想这就是答案。