[英]C# WPF ObservableCollection with dictionary inside to MVVM Datagrid
[英]C# WPF ListView MVVM ObservableCollection inside of an ObservableCollection
我有一個ObservableCollection
的Team
(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
的集合),所以您的Id
和Name
綁定不會綁定到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>
結果如下:
但是,如您所見,我只能 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.