分层数据绑定到平面 WPF 数据网格

本文关键字:数据 数据网 网格 WPF 平面 数据绑定 分层 | 更新日期: 2023-09-27 17:56:51

如何将分层数据结构'双向绑定'到平面WPF数据网格?

应用程序接口模型是iTunes - 我正在寻找数据网格看起来是平面的(不是主/细节网格)。 用户看到包含艺术家、专辑和歌曲的行;但数据是分层存储的,其中艺术家包含包含歌曲列表的专辑列表。

当用户重命名唱片集

时,层次结构会自动为给定艺术家查找或创建新唱片集(基于 Album.Name),并将歌曲移动到唱片集。

在平面数据和分层数据之间添加转换层似乎是一个糟糕的解决方案。

更新 1
在阅读了答案之后,如果没有大量的幕后工作,似乎无法实现我上面描述的目标。 看来我应该重新考虑以这种方式表示我的数据。

分层数据绑定到平面 WPF 数据网格

可以使用

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 模板以在视图之间切换(对于平面歌曲列表或按专辑排序的列表)。