Wpf MVVM一个ObservableCollection多个ListViews
本文关键字:多个 ListViews ObservableCollection 一个 MVVM Wpf | 更新日期: 2023-09-27 18:28:19
在我的MainView中,我添加了一个UserControl
<TabItem Header="Current Elements">
<tabData:CurrentElementsControl DataContext="{Binding Path=EditorViewModel.SelectedConfigFile}"></tabData:CurrentElementsControl>
</TabItem>
并设置其CCD_ 2。SelectedConfigFile
得到一个ObservableCollection<Elements>
其中存储不同类型的元素。
我的UserControl
基本上是ListView
<ListView Name="ServiceListView"
ItemsSource="{Binding Path=Elements}"
SelectedItem="{Binding Path=SelectedElement, Mode=TwoWay}"
Loaded="ServiceListView_Loaded"/>
其中我想要显示给定类型的CCD_ 7的项目。但我不想为每种类型和列表视图向SelectedConfigFile
(VM)添加另一个ObservableCollection
。所以我想我可以为我的UserControl设置一个Filter,使用它的Loaded事件如下(在codeehind中):
private void ServiceListView_Loaded(object sender, RoutedEventArgs e)
{
CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(this.ServiceListView.ItemsSource);
view.Filter = ServiceFilter;
}
private bool ServiceFilter(object item)
{
if (item is ServiceViewModel ) {
return true;
}
else {
return false;
}
}
但这也会过滤ObservableCollection<Elements>
,我在其他地方需要(未过滤)。有什么建议吗?
提前谢谢!
您显然需要不止一个视图。因此,不要获取无法以这种方式共享的默认视图。尝试创建这样的新视图:
private void ServiceListView_Loaded(object sender, RoutedEventArgs e) {
CollectionView view = new CollectionView(this.ServiceListView.ItemsSource);
view.Filter = ServiceFilter;
//use the created view here such as by assigning it to some ItemsSource
//...
}
只需在资源中使用相应的DataType指定DataTemplates就足够了,例如
<ListView Name="ServiceListView"
ItemsSource="{Binding Path=Elements}"
SelectedItem="{Binding Path=SelectedElement, Mode=TwoWay}"
Loaded="ServiceListView_Loaded"/>
<ListView.Resources>
<!-- Do NOT set the x:Key -->
<DataTemplate DataType="{x:Type local:ElementType1}">
<TextBlock Text="{Binding Name}" Foreground="Blue"/>
</DataTemplate>
<DataTemplate DataType="{x:Type local:ElementType2}">
<TextBlock Text="{Binding Model}" Foreground="Red"/>
</DataTemplate>
</ListView.Resources>
</ListView>
如果您不想显示特定类型的项目,请不要为其定义项目模板。这样,原始集合将保持不变,但只有某些元素会显示给用户。