【问题标题】:Hierarchical Data Binding to a flat WPF datagrid分层数据绑定到平面 WPF 数据网格
【发布时间】:2011-08-27 18:00:05
【问题描述】:

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

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

当用户重命名专辑时,层次结构会自动为给定的艺术家查找或创建新专辑(基于专辑名称),并将歌曲移动到专辑中。

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

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

【问题讨论】:

  • @soandos 我正在尝试找出一个聪明的方法来做到这一点,我不确定是否有已知的解决方案 - 我遇到了 ITypedList 接口,不知道这是否会是适当的。看来我正在尝试设计绑定到绑定

标签: c# wpf data-binding datagrid


【解决方案1】:

结构的扁平化可以通过使用 LINQ 投影来完成。 See the one-to-many projection in this article.

您所要做的就是在集合更改时重新查询。

我看不出有什么方法可以让它变得更容易,而且无论是 LINQ 查询、特殊绑定还是转换器,总是需要转换层,除非你找到可以为你做这件事的网格。

【讨论】:

  • 您是否考虑在层次结构中包含对父对象的引用,并尝试找到一种方法来绑定结构,即 Album.ParentArtist?
  • 是的,我会考虑(我可以称它为 Album.Artists 但这只是我,因为我期望多对多的关系)
【解决方案2】:

我也不喜欢翻译层,但这似乎是最简单的解决方案。

除此之外,您还可以编写自己的自定义模板。因此,例如,如果您的数据结构如下:专辑>歌曲,并且您希望它显示在这张图片中: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 模板以在视图之间切换(对于平面歌曲列表或按专辑排序的列表)。

【讨论】:

    猜你喜欢
    • 2011-01-31
    • 2017-05-14
    • 2011-09-28
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    相关资源
    最近更新 更多