在ObservableCollection内部的C#WPF ListView MVVM ObservableCollection

我有一个ObservableCollection Team中的一个(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>

iCMS 回答:在ObservableCollection内部的C#WPF ListView MVVM ObservableCollection

从其他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。我可以在每个列表中选择一个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正确绑定,这会有些困难。

本文链接:https://www.f2er.com/2286755.html

大家都在问