CollectionViewSource.GetDefaultView在SetBinding之后返回null

时间:2012-07-27 15:14:53

标签: c# .net wpf

我在WPF UserControl的构造函数中有一些代码。基本上我设置了一个绑定到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

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

2 个答案:

答案 0 :(得分:3)

您的Users.ItemsSourceItemCollection吗?然后,查看也可能是ItemCollection,因为它继承自CollectionView

CollectionViewSource.GetDefaultView会返回ICollectionView。还有更多类仅从CollectionView继承ListCollectionView。确保你的演员表没有失败,例如使用此代码:

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

答案 1 :(得分:0)

使用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阶段):

http://wpfgrid.blogspot.com/2013/01/simple-combobox-implementation.html