如何在WPF应用程序的代码后台中创建集合视图源

4
我有以下代码。
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个回答

12

CollectionViewSource.GetDefaultView(depts) 返回一个 ICollectionViewCollectionViewSource 主要是根据提供的集合来确定使用什么类型的 ICollectionView

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

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

然而,我相信你想实现的目标可以采用更好的方式来完成。例如:

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

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方面的开创性博客文章位于她的旧博客中。


嗨@Garry,一旦创建了ListCollectionView,我们如何将其分配回窗口资源,因为该资源的类型是CollectionViewSource - manu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接