代码之家  ›  专栏  ›  技术社区  ›  Dean Kuga

绑定多功能WPF数据网格

  •  4
  • Dean Kuga  · 技术社区  · 15 年前

    如何绑定一个WPF datagrid,该WPF datagrid需要显示来自许多不同数据源的数据,这些数据源具有不同列头和类型的不同列数?

    我现在做的是创建一个自定义 List<DataGridColumn>() 我的视图模型中要在此数据网格中显示的每个不同记录集合的数据网格列的列表。

    我循环此列表以设置DataGrid列:

    foreach (DataGridColumn dgc in dgcSample)
    {
      dgc.HeaderStyle = hStyle;
      dgMyDataGrid.Columns.Add(dgc);
    }
    

    dgMyDataGrid.ItemsSource = SomeCollection;
    

    这是有效的,但它不是绑定的,它违反了MVVM的原则,即ViewModel应该对特定的UI元素是不可知的,因为它现在必须处理 DataGrid 举办一个 DataGridColumn 物体。。。

    有什么想法吗?

    3 回复  |  直到 15 年前
        1
  •  1
  •   grantnz    15 年前

    是否考虑使用 http://www.codeproject.com/KB/grid/MultiColumnSetDataGrid.aspx

    这将允许视图在视图中定义多个列集并在它们之间切换。

        2
  •  2
  •   Homam    15 年前

    我想你得把你的 DataGrid 只有一个数据源,但您的任务只是创建这个数据源。

    我将创建一个示例,用于使用 LINQ ..

    假设您有两个不同的实体:Entity1和Entity2,并且每个实体都有公共ID:

    class Entity1
    {
        public int ID { get; set; }
        public string E1Column { get; set; }
    }
    
    class Entity2
    {
        public int ID { get; set; }
        public string E2Column { get; set; }
    }
    

    您可以使用 Join 在LINQ中,如下所示:

    List<Entity1> e1List = new List<Entity1>();
    e1List.Add(new Entity1() { ID = 1, E1Column = "E1 a" });
    e1List.Add(new Entity1() { ID = 2, E1Column = "E1 b" });
    
    List<Entity2> e2List = new List<Entity2>();
    e2List.Add(new Entity2() { ID = 1, E2Column = "E2 a" });
    e2List.Add(new Entity2() { ID = 2, E2Column = "E2 b" });
    
    var query = from e1 in e1List
                join e2 in e2List on e1.ID equals e2.ID
                select new { ID = e1.ID, E1Column = e1.E1Column, E2Column = e2.E2Column };
    
    // Bind the DataGrid
    dataGrid1.ItemsSource = query.ToList();
    

    祝你好运!

        3
  •  1
  •   Richard Harrison    15 年前

    IMO正确的方法是将所有数据源封装到一个对象中,这与您的自定义 List<DataGridColumn>() MultifunctionalSource .

    多功能源 负责提供可绑定的数据源。

    模型将提供类型为 看风景。

    在视图中,应该有一个从datagrid派生的新控件,该控件将了解如何显示类型为 . 这个新控件在第一个实例中可能非常简单,因为它可以简单地基于绑定设置其列。

    多功能源 应该返回一个它认为与显示相关的列的列表。它还应该能够返回完整的列列表,以使UI能够根据其他条件决定哪些列是相关的;从而保持边界。