如何在wpf app后面的代码中创建集合视图源

我有以下代码

public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); var entities = new DemoEntities(); var depts = entities.Depts.ToList(); // entity framwork dept table CollectionViewSource cvs = (CollectionViewSource)CollectionViewSource.GetDefaultView(depts); } } 

我的目的是在XAML中将此集合绑定到以下窗口资源

    

运用

 CollectionViewSource collectionViewSource = this.FindResource("Departments") as CollectionViewSource; 

但是在执行以下代码行时

CollectionViewSource cvs =(CollectionViewSource)CollectionViewSource.GetDefaultView(depts);

它抛出一个exception,并且该exception的内部exception正在跟随

 {"Unable to cast object of type 'System.Windows.Data.ListCollectionView' to type 'System.Windows.Data.CollectionViewSource'."} 

有人可以通过提供如何使用代码创建CollectionViewSource来帮助我吗?

CollectionViewSource.GetDefaultView(depts)返回ICollectionViewCollectionViewSource主要用于根据提供的集合确定要使用的ICollectionView类型。

如果你真的想创建一个CollectionViewSource ,你可能会这样做:

 var collectionViewSource = new CollectionViewSource(); collectionViewSource.Source = depts; 

但我确实相信你想要实现的目标可以更好地完成。 例如:

 var collectionViewSource = this.FindResource("Departments") as CollectionViewSource; collectionViewSource.Source = depts; 

CollectionViewSource.GetDefaultView方法返回ICollectionView

 ICollectionView icv = CollectionViewSource.GetDefaultView(dg1.ItemsSource); 

但是如果你绑定到一个inheritance自IList的集合(它在你的情况下会这样做),它也可以被强制转换为更强大的类型……

 ListCollectionView icv = CollectionViewSource.GetDefaultView(dg1.ItemsSource) as ListCollectionView; 

这是编译器想要做的,但不能。 因此错误。 所以改变你的’cvs’是合适的类型……

ICollectionView或ListCollectionView …取决于你想对结果做什么…

注意:Bea Stolnitz关于绑定到CollectionView的开创性博客文章在她的旧博客上