我正在设计一个程序,您可以购买和销售计算机部件,只是为了习惯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类型的项目吗?
答案 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
现在最后一部分是将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
中。希望能解决您所面临的问题。