如何在wpf应用程序的代码隐藏中创建集合视图源

本文关键字:创建 集合 视图 隐藏 代码 wpf 应用程序 | 更新日期: 2023-09-27 18:20:12

我有以下代码

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 中的以下窗口资源

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

如何在wpf应用程序的代码隐藏中创建集合视图源

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);

但是,如果您绑定到从IList继承的集合(在您的情况下是这样做的),它也可以强制转换为更强大的类型。。。

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

这是编译器想要做但不能做的。因此出现了错误。所以把你的简历改成合适的类型。。。

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

注意:Bea Stolnitz关于绑定到CollectionView的开创性博客条目位于她的旧博客