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>,我在其他地方需要(未过滤)。有什么建议吗?

提前谢谢!

Wpf MVVM一个ObservableCollection多个ListViews

您显然需要不止一个视图。因此,不要获取无法以这种方式共享的默认视图。尝试创建这样的新视图:

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>

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