绑定多功能WPF DataGrid

时间:2010-10-21 18:27:29

标签: c# wpf mvvm wpfdatagrid

如何绑定需要显示来自具有不同列标题和类型的不同列数的多个不同数据源的数据的WPF数据网格?

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

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

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

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

dgMyDataGrid.ItemsSource = SomeCollection;

这有效,但它没有绑定,它打破了MVVM指南,ViewModel应该与特定的UI元素无关,因为它现在必须处理DataGrid并托管DataGridColumn个对象的集合。 ..

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

我认为您必须将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();
祝你好运!

答案 1 :(得分:1)

IMO正确的做法是将所有数据源封装到一个对象中,这与您的自定义List<DataGridColumn>()类似。请拨打此MultifunctionalSource

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

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

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

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

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

答案 2 :(得分:1)

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

中显示的datagrid派生类

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