如何呈现 1:n 关系

本文关键字:关系 何呈现 | 更新日期: 2023-09-27 17:56:27

我正在使用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:n 关系

我会尽量保持简短,因为我不相信这个问题是堆栈溢出的主题。但是,无论哪种方式,答案都不需要很长。无论您有多少层层次结构,答案都是一样的。在 WPF 中,当我们有一个可以有一个或多个子项的父项时,我们只需在集合控件中显示这些子项。

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

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