我的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>
如果列表嵌套,则有一棵树,您可以使用HierarchicalDataTemplate并在TreeView中显示或嵌套ListViews。
如果要在平面列表中查看,请将ViewModel展平树,假设您使用的是MVVM模式。
您的列表视图将每个Team
显示为一个项目。因为您具有嵌套集合(Teams
是Actors
的集合的集合),所以Id
和Name
绑定不是绑定到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>
具有以下结果:
但是,如您所见,我只能选择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>
您决定如何扁平化列表由您决定。确保还要在Team
类上实现INPC,因为在Team
中修改ObservableCollection<Team>
不会告诉集合在没有INPC的情况下更新绑定。
如果您严格遵循MVVM,我可能建议您在控件代码的后面创建一些Dependency Property
,并将列表放平。
我的理由是,此操作纯粹是表面上的。整理列表时,我们不会执行业务逻辑或更改数据;我们只是为要view做好准备。因此,我们将代码放在与VM相对的代码后面。尽管从现在开始,您必须确保从VM DP Control而不是VM Control正确绑定,这有点困难。