在DataGrid中显示ObservableCollection中特定类型的项目

时间:2016-09-02 08:46:44

标签: c# wpf xaml mvvm

我正在设计一个程序,您可以购买和销售计算机部件,只是为了习惯MVVM。 我的模型包含类Gpu和Cpu,它们都是Product中的inhert,它是抽象的。 在我的ViewModel中,我有一个产品的ObservableCollection:

public ObservableCollection<Product> ProductList { get; set; }

ProductList = new ObservableCollection<Product(core.Repository.GetAll<Product>());

在我的视图中,我有2个DataGrids,一个用于Gpus,另一个用于Cpus。 我想在Gpu DataGrid上只显示我的ProductList中所有Gpus的名称,而不创建额外的List。

我的XAML代码:

<UserControl.DataContext>
   <vm:ProductViewModel/>
</UserControl.DataContext>

<DataGrid ItemsSource="{Binding ProductList}" AutoGenerateColumns="False">
  <DataGrid.Columns>
     <DataGridTextColumn Binding="{Binding Name}"/>
  </DataGrid.Columns>
</DataGrid>

使用此代码,DataGrid会显示产品名称,Gpus和Cpus, 有一种简单的方法只显示Gpu类型的项目吗?

1 个答案:

答案 0 :(得分:0)

根据我的理解,您希望过滤掉DataGrid中显示的不同产品类型。就像您可能会有ComboBox包含产品类型列表以及选择产品类型一样,您的DataGrid仅显示这些类型的产品。

您最好的解决方案是使用CollectionViewSource绑定到DataGrid而不是简单ObservableCollection

CollectionViewSource提供Filter方法,即使DataGrid包含所有项目,您也只能在ObservableCollection中显示所选项目。

你可以做这样的事情。

定义ICollectionView类型的引用,其中包含CollectionView的{​​{1}}

ObservableCollection<Product>

宣传private ICollectionView productListView = null; public ICollectionView ProductListView { get { return productListView; } set { productListView = value; NotifyPropertyChanged("ProductListView"); } } private ObservableCollection<Product> productList; getter,以便每当setter收藏集被设置时,您都可以填写CollectionView

ProductList

如果您看到上面public ObservableCollection<Product> ProductList { get { return productList; } set { productList = value; ProductListView = CollectionViewSource.GetDefaultView(value); ProductListView.Filter = FilterMethod; } } 填充了ProductListView的{​​{1}}

然后填写DefaultView,就像你已经做的那样。

ObservableCollection<Product>

现在,ProductList方法可以完成您想要的工作。它只会过滤掉ProductList = new ObservableCollection<Product>(core.Repository.GetAll<Product>()); 类型的Filter。只有那些对象才会显示在Objects

Gpu

CollectionViewSource

现在最后一部分是将DataGrid绑定到private bool FilterMethod(object item) { return item is Gpu ? true : false; } 而不是CollectionView

DataGrid

由于您使用ObservableCollection而非Code Behind将数据绑定到<DataGrid ItemsSource="{Binding ProductListView, UpdateSourceTrigger=PropertyChanged}" AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridTextColumn Binding="{Binding Name}"/> </DataGrid.Columns> </DataGrid> 。因此,上述代码也可以插入到ViewModel中。希望能解决您所面临的问题。