我有以下代码
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中的以下Windows资源
<Window.Resources>
<CollectionViewSource x:Key="Departments"/>
</Window.Resources>
使用
CollectionViewSource collectionViewSource = this.FindResource("Departments") as CollectionViewSource;
但是在执行以下代码行时
CollectionViewSource cvs =(CollectionViewSource)CollectionViewSource.GetDefaultView(depts);
它抛出异常,异常的内部异常在
之后{"Unable to cast object of type 'System.Windows.Data.ListCollectionView' to type 'System.Windows.Data.CollectionViewSource'."}
有人可以通过提供如何使用代码创建CollectionViewSource来帮助我吗?
答案 0 :(得分:9)
CollectionViewSource.GetDefaultView(depts)
会返回ICollectionView
。 CollectionViewSource
主要是根据所提供的集合确定要使用的ICollectionView
类型的方法。
如果你真的想创建一个CollectionViewSource
,你可能会这样做:
var collectionViewSource = new CollectionViewSource();
collectionViewSource.Source = depts;
然而,我确实相信你想要实现的目标可以更好地完成。例如:
var collectionViewSource = this.FindResource("Departments") as CollectionViewSource;
collectionViewSource.Source = depts;
答案 1 :(得分:2)
CollectionViewSource.GetDefaultView方法返回ICollectionView
ICollectionView icv = CollectionViewSource.GetDefaultView(dg1.ItemsSource);
但是如果你绑定到一个继承自IList的集合(它在你的情况下会这样做),它也可以被强制转换为更强大的类型......
ListCollectionView icv = CollectionViewSource.GetDefaultView(dg1.ItemsSource)
as ListCollectionView;
编译器想要做什么,但不能。因此错误。因此,将'cvs'更改为合适的类型......
ICollectionView或ListCollectionView ...取决于你想对结果做什么......
注意:Bea Stolnitz关于绑定到CollectionView的开创性博客文章位于her old blog