在我的MainView中我添加了UserControl
<TabItem Header="Current Elements">
<tabData:CurrentElementsControl DataContext="{Binding Path=EditorViewModel.SelectedConfigFile}"></tabData:CurrentElementsControl>
</TabItem>
并设置其DataContext
。 SelectedConfigFile
得到了ObservableCollection<Elements>
其中存储了不同类型的元素。
我的UserControl
基本上是ListView
<ListView Name="ServiceListView"
ItemsSource="{Binding Path=Elements}"
SelectedItem="{Binding Path=SelectedElement, Mode=TwoWay}"
Loaded="ServiceListView_Loaded"/>
我希望显示给定类型的ObservableCollection<Elements>
项。
但是我不希望为每个类型和列表视图向ObservableCollection
(VM)添加另一个SelectedConfigFile
。所以我想我可以为我的UserControl设置一个Filter,使用它的Loaded事件(在代码隐藏中):
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>
,我需要(未经过滤)在其他地方。有什么建议吗?
提前谢谢!
答案 0 :(得分:0)
你显然需要超过1个视图。因此,不要获得无法以这种方式共享的默认视图。尝试创建这样的新视图:
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
//...
}
答案 1 :(得分:0)
只需在参考资料中使用相应的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>
如果您不想显示特定类型的项目,请不要为其定义项目模板。这样原始集合保持不变,但只有某些元素才会显示给用户。