将分层数据绑定到扁平化的WPF数据网格

4
您如何将分层数据结构与平面WPF数据网格进行“双向绑定”?
应用程序界面模型是iTunes - 我希望数据网格呈现为平面(不是主/详细信息网格)。用户看到包含艺术家、专辑和歌曲的行;但数据以分层方式存储,其中一个艺术家包含专辑列表,专辑列表包含歌曲列表。
当用户重命名专辑时,层次结构会自动查找或创建给定艺术家的新专辑(基于Album.Name),并将歌曲移动到该专辑中。
在平面数据和分层数据之间添加翻译层似乎是一种不好的解决方案。
更新1 阅读答案后,似乎无法在幕后进行大量工作而实现我上述描述的内容。看来我应该重新考虑以这种方式表示我的数据。

@soandos 我正在尝试找出一个聪明的方法来解决它,我不确定是否有已知的解决方案 - 我遇到了 ITypedList 接口,不知道这是否合适。看起来我正在设计一个绑定到绑定的绑定。 - sfm
2个回答

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


0

通过使用LINQ投影,可以对结构进行展平。请参阅本文中的一对多投影

您需要注意的是,在集合更改时重新查询。

我没有看到任何更简单的方法,无论是LINQ查询、特殊绑定还是转换器,都需要一个翻译层,除非您找到一个可以为您完成此操作的网格。


您是否考虑在层次结构中包含对父对象的引用,并尝试找到一种绑定结构的方法,即Album.ParentArtist? - sfm
是的,我会考虑这个(我可能会称其为Album.Artists,但这只是因为我期望有多对多的关系)。 - Emond

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接