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

时间:2012-01-12 17:27:02

标签: c# .net wpf xaml observablecollection

我有以下代码

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来帮助我吗?

2 个答案:

答案 0 :(得分:9)

CollectionViewSource.GetDefaultView(depts)会返回ICollectionViewCollectionViewSource主要是根据所提供的集合确定要使用的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