Wpf MVVM一个ObservableCollection多个ListViews

时间:2014-10-30 06:47:38

标签: c# wpf listview mvvm

在我的MainView中我添加了UserControl

<TabItem Header="Current Elements">
                <tabData:CurrentElementsControl DataContext="{Binding Path=EditorViewModel.SelectedConfigFile}"></tabData:CurrentElementsControl>
            </TabItem>

并设置其DataContextSelectedConfigFile得到了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>,我需要(未经过滤)在其他地方。有什么建议吗?

提前谢谢!

2 个答案:

答案 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>

如果您不想显示特定类型的项目,请不要为其定义项目模板。这样原始集合保持不变,但只有某些元素才会显示给用户。