簡體   English   中英

C# WPF ListView MVVM ObservableCollection 在 ObservableCollection 內部

[英]C# WPF ListView MVVM ObservableCollection inside of an ObservableCollection

我有一個ObservableCollectionTeam (ObservableCollection<Team>) 在我的Team class 中,我有一個ObservableCollection的“Actor”(ObservableCollection)。 現在我想用 mvvm 模式在Listview中顯示演員。

有人有解決方案嗎? 我沒有在谷歌上找到任何可以在我的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>

從另一個stackoverflow帖子

如果列表是嵌套的,則您有一個樹,您可以使用 HierarchicalDataTemplate 並在 TreeView 或嵌套的 ListViews 中顯示。

如果你想在一個平面列表中查看,假設你使用的是 MVVM 模式,讓你的 ViewModel 展平樹。

您的列表視圖將每個單獨的Team顯示為一個項目。 因為您已經嵌套了 collections( Teams是 collections 的Actors的集合),所以您的IdName綁定不會綁定到Actor項目,而是綁定到Team項目。

我最初的解決方案是更深入地 go 並將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>

結果如下:

第一個解決方案嵌套 ListViews

但是,如您所見,我只能 select a Team 可以在每個列表中使用 select 一個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>

結果如下: 第二種解決方案扁平化列表

您決定如何展平列表取決於您。 確保在Team class 上實現 INPC,因為在ObservableCollection<Team>中修改Team不會告訴集合在沒有 INPC 的情況下更新綁定。

如果您嚴格遵循 MVVM,我可能會建議您在控件的代碼中創建一些Dependency Property並在此處展平列表。

我的理由是這個操作純粹是裝飾性的。 當我們展平列表時,我們並沒有執行業務邏輯或更改數據; 我們只是為我們想要如何查看它做准備。 因此,我們將把代碼放在代碼隱藏中,而不是 VM 中。 這有點困難,因為現在您必須確保從 VM <-> DP <-> Control 而非 VM <-> Control 正確綁定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM