我在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响应之前是否需要等待一个事件?
答案 0 :(得分:3)
您的Users.ItemsSource
是ItemCollection
吗?然后,查看也可能是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