[ObservableCollection内部的C#WPF ListView MVVM ObservableCollection

问题描述 投票:0回答:1

我的ObservableCollectionTeam (ObservableCollection<Team>)。在我的Team类中,我的ObservableCollection是“演员”(ObservableCollection)。现在,我要以mvvm模式在Listview中显示演员。

任何人都有解决方案吗?我没有在Google上找到任何可在Listview中显示演员的内容。

提前感谢。

<Window x:Class="Room.Views.MainView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:Room.Views"
    xmlns:localBind="clr-namespace:Room.ViewModels"
    mc:Ignorable="d"
    Title="" Height="300" Width="800">

<Window.DataContext>
    <localBind:MainViewModel/>
</Window.DataContext>

<Grid>
    <ListView Margin="10" ItemsSource="{Binding Teams}"
              SelectedItem="{Binding SelectedActor}" >
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Id" Width="80" DisplayMemberBinding="{Binding Id}"/>
                <GridViewColumn Header="Niggname" Width="160" 
                                DisplayMemberBinding="{Binding Name}" />
            </GridView>
        </ListView.View>
    </ListView>
</Grid>

c# wpf listview mvvm observablecollection
1个回答
0
投票

来自此stackoverflow post

如果列表嵌套,则有一棵树,您可以使用HierarchicalDataTemplate并在TreeView中显示或嵌套ListViews。

如果要在平面列表中查看,请将ViewModel展平树,假设您使用的是MVVM模式。

您的列表视图将每个Team显示为一个项目。因为您具有嵌套集合(TeamsActors的集合的集合),所以IdName绑定不是绑定到Actor项目,而是绑定到Team项目。

我最初的解决方法是更深入,将listview放在listview

<ListView ItemsSource="{Binding Teams}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ListView Margin="10" ItemsSource="{Binding Actors}"
                          SelectedItem="{Binding SelectedActor}" >
                <ListView.View>
                    <GridView>
                        <GridViewColumn Header="Id" Width="80" DisplayMemberBinding="{Binding Id}"/>
                        <GridViewColumn Header="Name" Width="160" 
                                            DisplayMemberBinding="{Binding Name}" />
                    </GridView>
                </ListView.View>
            </ListView>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

具有以下结果:

First Solution Nested ListViews

但是,如您所见,我只能选择Team。我can在每个列表中选择一个Actor,但这不是您想要的(在运行假设下,您需要一个列表)。

对我来说,更容易的是用C#压扁树。假设我有一个固定的演员列表(不考虑团队),我可以这样做:

<ListView ItemsSource="{Binding AllActors}"
          SelectedItem="{Binding SelectedActor}" >
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Id" Width="80" DisplayMemberBinding="{Binding Id}"/>
            <GridViewColumn Header="Name" Width="160" 
                            DisplayMemberBinding="{Binding Name}" />
        </GridView>
    </ListView.View>
</ListView>

具有以下结果:Second Solution Flattened List

您决定如何扁平化列表由您决定。确保还要在Team类上实现INPC,因为在Team中修改ObservableCollection<Team>不会告诉集合在没有INPC的情况下更新绑定。

如果您严格遵循MVVM,我可能建议您在控件代码的后面创建一些Dependency Property,并将列表放平。

我的理由是,此操作纯粹是表面上的。整理列表时,我们不会执行业务逻辑或更改数据;我们只是为要view做好准备。因此,我们将代码放在与VM相对的代码后面。尽管从现在开始,您必须确保从VM DP Control而不是VM Control正确绑定,这有点困难。

© www.soinside.com 2019 - 2024. All rights reserved.