2012-01-12 42 views
3

我有下面的代码如何在代码中创建集合查看源代码背后的WPF应用程序

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后面创建?

回答

6

CollectionViewSource.GetDefaultView(depts)返回ICollectionViewCollectionViewSource主要是根据所提供的集合来确定使用何种类型的ICollectionView的手段。

如果你实在想不过来创建一个CollectionViewSource,你也许可以做到这一点,像这样:

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

我却相信你正在努力实现以更好的方式可以做什么。例如:

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

感谢代码,它解决了这个目的。 – Elangesh 2012-01-13 11:28:05

1

的CollectionViewSource.GetDefaultView方法返回的ICollectionView

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

但如果你绑定到自IList(其中它在你的情况)继承了一个集合,它也可以是投到更强大的类型...

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

这是编译器想要做什么,但不能。因此错误。因此,改变你的“CVS”是合适的类型......

ICollectionView或ListCollectionView的...这取决于你想要的结果,该怎么办...

注:衣Stolnitz的开创性博客条目上绑定到一个CollectionView是在her old blog

+0

Hi @Garry,一旦'ListCollectionView'被创建,我们如何将它分配回窗口资源,因为该资源的类型是'CollectionViewSource' – Elangesh 2012-01-13 11:12:05