如何呈现1:n关系?

时间:2014-04-03 09:57:58

标签: c# wpf linq entity-framework data-binding

我正在使用EntityFramework 6和WPF在一个项目中工作。我在EF6中使用了代码优先,重要部分如下:

public class Serie
{
    public virtual Operation CurrentOperation { get; set; }
}

public class Operation
{
    public Operation()
    {
        this.Series = new ObservableCollection<Serie>();
    }

    public virtual ObservableCollection<Serie> Series { get; set; }
}

这一切都很好。所以我有一个像Series (n) - (1) Operation这样的表关系,一个操作可以有零/ 1 /多个系列。

现在,我完全不知道如何在DataGrid / DataTable / Collection中展示这种关系。我希望有类似的东西:(动态生成)

Operation 1  Operation 2  Operation 3
-------------------------------------
Series 1.1   Series 2.1   Series 3.1
Series 1.2   Series 2.2   Series 3.2
Series 1.3   Series 2.2   Series 3.2

操作名称应该是表格标题,下面是它们的相关系列。通常我使用数据绑定(WPF样式),我尝试过类似的东西:

using (var _context = new ProdPlanNET.Models.DatabaseContext())
{
    _context.Operations.Load();

    var res = from operation in _context.Operations
              select operation.Name;

    foreach (String Name in res)
    {
        DataColumn c;
        c = new DataColumn();
        c.ColumnName = Name;
        dt.Columns.Add(c);
    }  
}

也是使用CollectionViewSource尝试,但没有成功。我甚至不知道View(DataGrid,列表)的最佳/正确表示对象是什么。感谢任何提示。

1 个答案:

答案 0 :(得分:1)

我会尽量保持简短,因为我不相信这个问题是关于Stack Overflow的主题。但是,无论如何,答案都不需要很长。无论您拥有多少层次结构,答案都是一样的。在WPF中,当我们有一个可以有一个或多个子节点的父节点时,我们只需在集合控件中显示子节点。

同样适合您的DataGrid ...每一行(父级)可以在其中一列中拥有ComboBoxListBox来保存多个子项。现在,即使你有一个Operation个对象集合的另一个级别,每个对象都有Series个对象的集合,每个对象都有自己的内部Operation个对象,那么你可以只移动你的层次结构一个级别。

顶级项目的每一行都可以在其中一列中包含DataGrid来保存多个子项目。话虽如此,我觉得在这个级别上,您最好创建自己的自定义用户界面,可能使用可折叠的Expander或其他节省空间的措施。