Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将分层数据模型绑定到DataGrid_C#_.net_Wpf_Mvvm_Datagrid - Fatal编程技术网

C# 将分层数据模型绑定到DataGrid

C# 将分层数据模型绑定到DataGrid,c#,.net,wpf,mvvm,datagrid,C#,.net,Wpf,Mvvm,Datagrid,我有一个简单WPF应用程序的分层数据结构,如下所示: TvshowCollection对象包含Tvshow对象。每个Tvshow对象都包含一个eposodecollection对象,而eposodecollection对象又包含一个插曲对象。该模型大量使用INotifyPropertyChanged 我需要在网格中显示所有事件对象的列表,以及电视节目的名称 如果我从结构中获取所有剧集并将它们绑定到网格的ItemsSource,那么很容易将剧集的每个属性绑定到一个列,但是如何将其中一个列绑定到层次

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

TvshowCollection对象包含Tvshow对象。每个Tvshow对象都包含一个eposodecollection对象,而eposodecollection对象又包含一个插曲对象。该模型大量使用INotifyPropertyChanged

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

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

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

我希望这是有道理的

谢谢


编辑:

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

图片如下:

在某种程度上,我现在正在工作,但不是以我特别喜欢的方式。 我在ViewModel上放置了一个属性,以便网格返回一个包含所需信息的对象:

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;
    }
}

但我似乎无法使它成为双向绑定。有更好的办法吗

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

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"/>

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

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"/>


请添加一个示例,说明您希望它的外观。我相信我在SQL中也做过类似的事情,但我们应该能够将其应用于C#。请添加一个示例,说明您希望它看起来如何。我相信我在SQL中也做过类似的事情,但我们应该能够将其应用到C#。谢谢,我会试试的。将此代码用于“get”是否也可以在网格中编辑属性后使用双向绑定来设置属性?至少在WPF中是这样,只需将“return”更改为“return flatList.ToList()”。添加和删除都有问题,但您可以从DataGrid获取结果项并将其转换回。谢谢,我会尝试的。将此代码用于“get”是否也可以在网格中编辑属性后使用双向绑定来设置属性?至少在WPF中是这样,只需将“return”更改为“return flatList.ToList()”。添加和删除存在问题,但您可以从DataGrid获取结果项并将其转换回。