【问题标题】:Binding a hierarchical data model to a DataGrid将分层数据模型绑定到 DataGrid
【发布时间】:2011-05-19 07:10:24
【问题描述】:

我有一个简单 WPF 应用程序的分层数据结构,如下所示:

TvshowCollection 对象包含 Tvshow 对象。每个 Tvshow 对象都包含一个 EpisodeCollection 对象,该对象又包含 Episode 对象。该模型大量使用了 INotifyPropertyChanged。

我需要在网格中显示所有剧集对象的列表,以及电视节目的名称。

如果我从结构中获取所有剧集并将它们绑定到网格的 ItemsSource,则很容易将剧集的每个属性绑定到一列,但是我如何才能将其中一列绑定到相关的 Tvshow在层次结构中较高的名称属性?

我可以在 ViewModel 中以某种方式展平数据吗?

我希望这是有道理的。

谢谢!


编辑:

感谢 MAW74656,这就是我想要的最终结果 - 显示系统中的所有剧集,并在网格中重复电视节目的详细信息(播出日期是剧集的属性):

图片在这里:http://i.stack.imgur.com/SY1Ib.png

我现在可以在一定程度上做到这一点,但不是以我特别喜欢的方式。 我在 ViewModel 上放置了一个属性,以便 Grid 返回一个包含我需要的信息的对象:

public class TvshowGridViewModel : BaseViewModel
{
    private Repository _repo;

    private TvshowCollection _allTvshows;

    public object AllTvshows
    {
        get
        {
            var flatList = from tvshow in _allTvshows
                           from episode in tvshow.Episodes
                           select new { TvshowName = tvshow.Name, EpisodeName = episode.Name, EpisodeNumber = episode.Number, EpisodeAirdate = episode.Airdate };
            return flatList;
        }
    }

    public TvshowGridViewModel()
    {
        _repo = new Repository("");
        _allTvshows = _repo.Tvshows;
    }
}

但我似乎无法将其设为双向绑定。有没有更好的办法?

【问题讨论】:

  • 请添加一个您希望它的外观的示例。我相信我在 SQL 中做过类似的事情,但我们应该能够将其适应 C#。

标签: c# .net wpf mvvm datagrid


【解决方案1】:

尝试使用对象而不是字符串:

var flatList = from tvshow in _allTvshows
               from episode in tvshow.Episodes
               select new { TvShow = tvshow, Episode = episode};

DataGrid 应该有明确指定的列:

<sdk:DataGridTextColumn Binding="{Binding TvShow.Name}" Header="Tv Show"/>
<sdk:DataGridTextColumn Binding="{Binding Episode.Name}" Header="Episode Name"/>

【讨论】:

  • 谢谢,我会试试的。将此代码用于“获取”,是否也可以在网格中编辑属性后使用双向绑定设置属性?
  • 它可以工作,至少在 WPF 中,只需将“return”更改为“return flatList.ToList()”。添加和删​​除有问题,但是您可以从DataGrid中获取结果项并将它们转换回来。
猜你喜欢
  • 2020-07-21
  • 2016-08-28
  • 1970-01-01
  • 1970-01-01
  • 2014-08-05
  • 2011-07-09
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多