绑定多functionWPF DataGrid
您将如何绑定需要显示来自具有不同列标题和类型的不同列数的许多不同数据源的数据的WPF数据网格?
我目前正在做的是在我的ViewModel中为要在此DataGrid中显示的每个不同记录集合创建自定义List()
的datagrid列列表。
我遍历此列表以设置DataGrid列:
foreach (DataGridColumn dgc in dgcSample) { dgc.HeaderStyle = hStyle; dgMyDataGrid.Columns.Add(dgc); }
最后,我使用ItemsSource来设置项目的来源:
dgMyDataGrid.ItemsSource = SomeCollection;
这有效,但它没有绑定,它打破了MVVM指南,ViewModel应该与特定的UI元素无关,因为它现在必须处理DataGrid
并托管DataGridColumn
对象的集合……
有什么想法吗?
您是否考虑过使用http://www.codeproject.com/KB/grid/MultiColumnSetDataGrid.aspx中显示的datagrid派生类
这将允许您查看在视图中定义多个列集并在它们之间切换。
我认为你必须将DataGrid
绑定到一个数据源,但你的任务就是创建这个数据源。
我将创建一个使用LINQ从不同实体创建DataSource的示例。
假设您有两个不同的实体: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创建DataSource,如下所示:
List e1List = new List (); e1List.Add(new Entity1() { ID = 1, E1Column = "E1 a" }); e1List.Add(new Entity1() { ID = 2, E1Column = "E1 b" }); List e2List = new List (); 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
。 调用此MultifunctionalSource
。
这个新对象将包含列的列表,可能包含添加新源并聚合它们的方法。 可能在添加新源时,您可以自动管理列列表。
MultifunctionalSource
负责提供可绑定的数据源。
该模型将向View提供MultifunctionalSource
类型的对象。
在视图中,您应该有一个从datagrid派生的新控件,它将了解如何显示MultifunctionalSource
类型的对象。 这个新控件在第一个实例中可能非常简单,因为它可以根据绑定简单地设置其列。
MultifunctionalSource
应该返回它认为与显示相关的列列表。 它还应该能够返回完整的列列表,以使UI能够根据其他标准确定哪些列是相关的; 从而保持边界。