如何将分层数据结构“双向绑定”到平坦的wpf数据网格?
应用程序界面模型 iTunes - 我正在寻找数据网格显示为平面(不是主/细节网格)。用户可以看到包含艺术家,专辑和歌曲的行;但是数据以层次方式存储,其中艺术家包含一个包含歌曲列表的专辑列表。
当用户重命名相册时,层次结构会自动查找或创建给定艺术家的新相册(基于Album.Name),并将乐曲移动到相册。
在平面数据和分层数据之间添加转换层似乎是一个糟糕的解决方案。
更新1
阅读完答案之后,如果没有幕后的大量工作,就无法实现我上面所描述的目标。我似乎应该重新考虑以这种方式表示我的数据。
答案 0 :(得分:0)
可以使用LINQ投影来完成结构的展平。 See the one-to-many projection in this article
您需要注意的是,当集合发生变化时,您需要重新查询。
我没有看到让它变得更容易的方法,无论是LINQ查询还是特殊绑定或转换器,总是需要翻译层,除非你找到一个可以为你做的网格。
答案 1 :(得分:0)
我不喜欢翻译层,但这似乎是最简单的解决方案。
除此之外,您还可以编写自己的自定义模板。例如,如果您的数据结构如下:相册>歌曲,您希望它显示如下图所示:http://files.jerahmeelcosinas.net/stackoverflow/itunes.jpg
这将是这样的:
<ItemsControl ItemsSource="{Binding Albums}">
<ItemsControl.Template>
<ControlTemplate>
<DockPanel>
<StackPanel Orientation="Vertical" DockPanel.Dock="Left">
<Image Source="{Binding AlbumImage}"/>
<TextBlock Text="{Binding AlbumName}"/>
</StackPanel>
<ListView ItemsSource="{Binding Songs}" >
<ListView.View>
<GridView>
<GridViewColumn DisplayMemberBinding="{Binding SongName}" Header="Name" />
<GridViewColumn DisplayMemberBinding="{Binding SongLength}" Header="Length" />
</GridView>
</ListView.View>
</ListView>
</DockPanel>
</ControlTemplate>
</ItemsControl.Template>
您可以在运行时切换ItemsControl模板以在视图之间切换(对于平面歌曲列表或按专辑排序的列表)。