2010-10-21 159 views
4

你將如何去綁定一個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對象...

有什麼想法?

回答

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

IMO這樣做的正確方法是將所有數據源封裝到單個對象中,這與您的自定義List<DataGridColumn>()類似。致電MultifunctionalSource

這個新對象將包含列的列表,可能會添加新源並將其聚合的方法。可能在添加新源時,您可以自動管理列的列表。

MultifunctionalSource負責提供可綁定的數據源。

該模型將向視圖提供MultifunctionalSource類型的對象。

在視圖中,您應該有一個從datagrid派生的新控件,該控件將瞭解如何顯示MultifunctionalSource類型的對象。首先,這個新控件可能會非常簡單,因爲它可以簡單地根據綁定來設置它的列。

MultifunctionalSource應該可能返回它認爲與顯示相關的列的列表。它也應該能夠返回列的完整列表,以使UI能夠根據其他標準來決定哪些列是相關的;從而保持了界限。