6

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

问题是,如果在 SetBinding 调用之后直接调用 GetDefaultView,则返回 null - 好像正在进行一些异步处理来设置 ItemsSource。请注意,如果我稍后在按钮 Click 处理程序中调用相同的 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 响应之前我需要等待一个事件吗?

4

2 回答 2

3

你是Users.ItemsSource一个ItemCollection吗?那么可能 view 也是一个,ItemCollection因为它继承自CollectionView.

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

var view = CollectionViewSource.GetDefaultView(Users.ItemsSource);
Console.WriteLine(view.GetType());
于 2012-07-27T16:37:05.780 回答
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

于 2013-01-10T16:07:26.927 回答