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

时间:2011-05-18 04:36:47

标签: c# wpf data-binding datagrid

如何将分层数据结构“双向绑定”到平坦的wpf数据网格?

应用程序界面模型 iTunes - 我正在寻找数据网格显示为平面(不是主/细节网格)。用户可以看到包含艺术家,专辑和歌曲的行;但是数据以层次方式存储,其中艺术家包含一个包含歌曲列表的专辑列表。

当用户重命名相册时,层次结构会自动查找或创建给定艺术家的新相册(基于Album.Name),并将乐曲移动到相册。

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

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

2 个答案:

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