绑定多功能WPF数据网格

问题描述:

你将如何去绑定一个WPF数据网格,该数据网格需要显示来自多个不同数据源的数据,并且列数不同,列标题和类型不同?绑定多功能WPF数据网格

我目前正在做的是在我的ViewModel中创建一个自定义的List<DataGridColumn>()列的datagrid列,以显示在此DataGrid中的每个不同的记录集合。

我遍历这个列表来设置DataGrid列:

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

最后,我用的ItemsSource设置项目的来源:

dgMyDataGrid.ItemsSource = SomeCollection; 

这工作,但它不具有约束力它打破了MVVM的准则,即ViewModel应该与特定的UI元素无关,因为它现在必须处理DataGrid并主持一组DataGridColumn对象...

有什么想法?

你有没有使用所示的DataGrid派生类中http://www.codeproject.com/KB/grid/MultiColumnSetDataGrid.aspx

这将允许您查看您的视图定义多列组并在它们之间进行切换考虑。

我认为你必须将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; } 
} 

您可以使用LINQ像Join下面创建数据源:

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(); 

祝你好运!

IMO这样做的正确方法是将所有数据源封装到单个对象中,这与您的自定义List<DataGridColumn>()类似。致电MultifunctionalSource

这个新对象将包含列的列表,可能会添加新源并将其聚合的方法。可能在添加新源时,您可以自动管理列的列表。

MultifunctionalSource负责提供可绑定的数据源。

该模型将向视图提供MultifunctionalSource类型的对象。

在视图中,您应该有一个从datagrid派生的新控件,该控件将了解如何显示MultifunctionalSource类型的对象。首先,这个新控件可能会非常简单,因为它可以简单地根据绑定来设置它的列。

MultifunctionalSource应该可能返回它认为与显示相关的列的列表。它也应该能够返回列的完整列表,以使UI能够根据其他标准来决定哪些列是相关的;从而保持了界限。