绑定多功能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能够根据其他标准来决定哪些列是相关的;从而保持了界限。