分层数据绑定到平面 WPF 数据网格
本文关键字:数据 数据网 网格 WPF 平面 数据绑定 分层 | 更新日期: 2023-09-27 17:56:51
如何将分层数据结构'双向绑定'到平面WPF数据网格?
应用程序接口模型是iTunes - 我正在寻找数据网格看起来是平面的(不是主/细节网格)。 用户看到包含艺术家、专辑和歌曲的行;但数据是分层存储的,其中艺术家包含包含歌曲列表的专辑列表。
当用户重命名唱片集时,层次结构会自动为给定艺术家查找或创建新唱片集(基于 Album.Name),并将歌曲移动到唱片集。
在平面数据和分层数据之间添加转换层似乎是一个糟糕的解决方案。
更新 1
在阅读了答案之后,如果没有大量的幕后工作,似乎无法实现我上面描述的目标。 看来我应该重新考虑以这种方式表示我的数据。
可以使用
LINQ 投影完成结构的平展。请参阅本文中的一对多投影。
您所要做的就是在集合更改时重新查询。
我没有看到一种使它更容易的方法,并且始终需要转换层,无论是 LINQ 查询还是特殊绑定或转换器,除非您找到适合您的网格。
我也不喜欢翻译层,但这似乎是最简单的解决方案。
除此之外,您还可以编写自己的自定义模板。因此,例如,如果您的数据结构为:专辑>歌曲,并且您希望它像下图所示显示: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 模板以在视图之间切换(对于平面歌曲列表或按专辑排序的列表)。