2016-01-21 67 views
1

我正在開發一個使用MVVM模式的WPF 4應用程序。我有一個DataGrid控件,自動生成列並綁定一個DataTable對象。如何在DataGrid控件中包含ListBox

我的表,現在是這樣的:

+------------+---------------+---------------+ 
| Date  | Shop 1  | Shop 2  | 
+------------+---------------+---------------+ 
| 2016-01-01 | 09:00 - 13:00 | N/A   | 
+------------+---------------+---------------+ 
| 2016-01-02 | N/A   | 14:00 - 18:00 | 
+------------+---------------+---------------+ 

我需要這樣的結果:

+------------+---------------+---------------+ 
| Date  | Shop 1  | Shop 2  | 
+------------+---------------+---------------+ 
| 2016-01-01 | 9:00 - 13:00 | N/A   | 
|   | 14:00 - 18:00 |    | 
+------------+---------------+---------------+ 
| 2016-01-02 |    | 14:00 - 18:00 | 
|   | 9:00 - 10:00 |    | 
|   | 12:00 - 14:00 |    | 
+------------+---------------+---------------+ 

在幾小時每個範圍,我需要不同的顏色,所以我會綁定一個列表框的每個電池桌子。

其實我的XAML代碼是這樣的:

<DataGrid x:Name="grdScheduler" 
      IsEnabled="False" 
      AutoGenerateColumns="True" 
      HeadersVisibility="None" 
      ItemsSource="{Binding SchedulerDataTable, Mode=OneWay}">    
</DataGrid> 

請,你能幫幫我嗎?

感謝

+0

你真的需要它是自動生成的列嗎? – Lance

+0

Shop 1和Shop 2 DataColumn的數據類型是什麼?它是一個數組/列表還是隻是一個字符串? – Lance

+0

@ LawrenceA.Contreras:不幸的是,我需要自動生成列。我有一個Shop1和Shop2列的列表對象。 – ilMattion

回答

0

我覺得this類似於你在問什麼。但我舉了一個適合你的問題的例子。

您需要爲您的List<object>列類型提供DataGridtemplateColumn。爲此,我們爲Datagrid的AutoGeneratingColumn事件創建一個事件處理程序。是的,您需要編寫一些代碼,但這不會破壞您的MVVM世界中的任何內容。你可以在後面編寫代碼,或者你可以實現自己的datagrid自定義控件,如果你想要一個更乾淨的方式來做到這一點。 現在在DataGrid.Resource中,我們有一個名爲ListTemplate的DataTemplate。這將是每個List<object>列的單元格模板。

<DataGrid x:Name="grdScheduler" 
     IsEnabled="False" 
     AutoGenerateColumns="True" 
     HeadersVisibility="None" 
     ItemsSource="{Binding SchedulerDataTable, Mode=OneWay}"   
     AutoGeneratingColumn="grdScheduler_AutoGeneratingColumn"> 
    <DataGrid.Resources> 
    <DataTemplate x:Key="ListTemplate"> 
     <ListBox ItemsSource="{Binding}" /> 
    </DataTemplate> 
    </DataGrid.Resources> 
</DataGrid> 

對於類型的每一列List<object>你需要使用一個DynamicDataGridTemplateColumn和使用ListTemplate作爲CellTemplate。在此代碼塊中,如果需要,還可以爲每個生成的列使用不同的模板。

private void grdScheduler_AutoGeneratingColumn(object sender, System.Windows.Controls.DataGridAutoGeneratingColumnEventArgs e) 
    { 
     if (e.PropertyType == typeof(List<object>)) 
     { 
     DynamicDataGridTemplateColumn dgTemplateCol = new DynamicDataGridTemplateColumn(); 
     dgTemplateCol.CellTemplate = (sender as DataGrid).FindResource("ListTemplate") as DataTemplate; 
     dgTemplateCol.ColumnName = e.PropertyName; 
     e.Column = dgTemplateCol; 
     } 
    } 

這裏是爲DynamicDataGridTemplateColumn的代碼。

public class DynamicDataGridTemplateColumn : DataGridTemplateColumn 
    { 
    public string ColumnName 
    { 
     get; 
     set; 
    } 

    protected override System.Windows.FrameworkElement GenerateElement(DataGridCell cell, object dataItem) 
    { 
     // The DataGridTemplateColumn uses ContentPresenter with your DataTemplate. 
     ContentPresenter cp = (ContentPresenter)base.GenerateElement(cell, dataItem); 
     // Reset the Binding to the specific column. The default binding is to the DataRowView. 
     BindingOperations.SetBinding(cp, ContentPresenter.ContentProperty, new Binding(this.ColumnName)); 
     return cp; 
    } 
    } 
相關問題