2013-06-25 47 views
0

我有一個充滿數據的DataGrid。我想要做的是修改特定行的模板以顯示行和新的標題。例如:具有多個標頭的DataGrid

Header 1 | Header 2 | Header 3 
Data 1 | Data 2 | Data 3        (row 1) 
Data 1 | Data 2 | Data 3        (row 2) 
Header 1 | Header 2 | Header 3 | Header 4 | Header 5   (row 3) 
Data 1 | Data 2 | Data 3 | Data 4 | Data 5   (row 3) 
Data 1 | Data 2 | Data 3        (row 4) 

Here is a screen shot illustrating my needs.

有沒有辦法來實現這一目標?謝謝。

+0

它是否總是行(3)應該有標題和數據的第三行? – 8bitcat

+0

不,它可以是任何行。 –

回答

2

我終於找到一種方法來實現我要怎樣做:

我將DataGrid。帶有從DataTemplateSelector派生的Selector的ItemTemplateSelector屬性。在這個選擇器的SelectTemplate()方法中,我爲普通行(應用默認模板)返回null,否則我創建並返回對應於特殊行的DataTemplate(動態的,感謝XamlReader)。該模板由一個DataGrid組成。 DataGrid的ItemsSource屬性使用轉換器進行設置(將行數據轉換爲對象列表)。

1

我已成功地創建以下文件:

enter image description here

如果我理解正確的話,在這種情況下,你必須使用一個嵌套DataGrid。這個效果可以通過DataGridTemplateColumn.CellTemplate -> your DataTemplate來實現。此外,該模式應該是「正常」TextBlock,所以它隱藏時嵌套DataGrid顯示一些值。檢查將使用DataTemplate中的DataTrigger進行。

XAML代碼:

<DataGrid Name="SimpleDataGrid" AutoGenerateColumns="False" RowHeaderWidth="0" CanUserAddRows="False" CanUserResizeColumns="False" CanUserResizeRows="False" Loaded="SimpleDataGrid_Loaded"> 
     <DataGrid.Columns> 
      <DataGridTemplateColumn Width="1.5*" Header="HeaderWithDataGrid" IsReadOnly="False"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <Grid> 
          <!-- Nested DataGrid --> 
          <DataGrid Name="InsertedDataGrid" AutoGenerateColumns="False" RowHeaderWidth="0" Loaded="InsertedDataGrid_Loaded"> 
           <DataGrid.Columns> 
            <DataGridTextColumn Header="InsertedHeader1" Width="1.5*" Binding="{Binding Name}" IsReadOnly="False" /> 
            <DataGridTextColumn Header="InsertedHeader2" Width="1.5*" Binding="{Binding Age}" IsReadOnly="False" /> 
            <DataGridTextColumn Header="InsertedHeader3" Width="1.5*" Binding="{Binding Name}" IsReadOnly="False" /> 
           </DataGrid.Columns> 
          </DataGrid> 

          <!-- Simply value, if nested DataGrid will be Hidden --> 
          <TextBlock Name="SimpleValue" Text="{Binding Age}" Visibility="Hidden" /> 
         </Grid> 

         <DataTemplate.Triggers> 
          <!-- It checks for Hidden NestedDataGrid --> 
          <DataTrigger Binding="{Binding ShowInsertedGrid}" Value="Hidden"> 
           <Setter TargetName="InsertedDataGrid" Property="Visibility" Value="Collapsed" /> 
           <Setter TargetName="SimpleValue" Property="Visibility" Value="Visible" /> 
          </DataTrigger> 
         </DataTemplate.Triggers> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 

      <!-- Simply column --> 
      <DataGridTextColumn Header="SimpleHeader" Width="1.5*" Binding="{Binding Name}" IsReadOnly="False" /> 
     </DataGrid.Columns> 
    </DataGrid> 

Person類上市:

public class Person 
{ 
    public string Name 
    { 
     get; 
     set; 
    } 

    public int Age 
    { 
     get; 
     set; 
    } 

    // For clarity using string. 
    // In real project using a bool. 
    public string ShowInsertedGrid 
    { 
     get; 
     set; 
    } 
} 

兩個ObservableCollection爲DataGrid的:

private ObservableCollection<Person> DataForDataGrid = new ObservableCollection<Person>(); 
private ObservableCollection<Person> DataForInsertedDataGrid = new ObservableCollection<Person>(); 

在處理Loaded事件設置主DataGrid的數據:

private void SimpleDataGrid_Loaded(object sender, RoutedEventArgs e) 
    { 
     DataForDataGrid.Add(new Person() 
     {     
      Age = 2, 
      Name = "Nick", 
      ShowInsertedGrid = "Hidden", // Hidden NestedDataGrid 
     }); 

     DataForDataGrid.Add(new Person() 
     { 
      Age = 1, 
      Name = "Sam", 
     }); 

     DataForDataGrid.Add(new Person() 
     { 
      Name = "Kate", 
      Age = 15, 
      ShowInsertedGrid = "Hidden", // Hidden NestedDataGrid 
     }); 

     SimpleDataGrid.ItemsSource = DataForDataGrid;    
    } 

Loaded事件處理程序NestedDataGrid:

private void InsertedDataGrid_Loaded(object sender, RoutedEventArgs e) 
    { 
     DataGrid MyDataGrid = sender as DataGrid; 

     DataForInsertedDataGrid.Add(new Person() 
     { 
      Name = "Bob", 
      Age = 15, 
     }); 

     DataForInsertedDataGrid.Add(new Person() 
     { 
      Name = "SpanchBob", 
      Age = 151, 
     }); 

     MyDataGrid.ItemsSource = DataForInsertedDataGrid; 
    } 

對於美容和提高使用Styles外觀。

編輯:

如果你希望你的嵌套DataGrid是對整個的話,我可以建議以下解決方案(而不是事實,這是最好的解決辦法,但我只能提供這種):

enter image description here

對於每個小區將使用DataTemplate中。因此SimpleHeader轉化爲:

  <DataGridTemplateColumn Width="1.5*" Header="SimpleHeader" IsReadOnly="False"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <Grid> 
          <!-- Nested DataGrid --> 
          <DataGrid Name="InsertedDataGrid2" AutoGenerateColumns="False" RowHeaderWidth="0" Loaded="InsertedDataGrid2_Loaded"> 
           <DataGrid.Columns> 
            <DataGridTextColumn Header="InsertedHeader4" Width="1.5*" Binding="{Binding Name}" IsReadOnly="False" /> 
            <DataGridTextColumn Header="InsertedHeader5" Width="1.5*" Binding="{Binding Age}" IsReadOnly="False" /> 
            <DataGridTextColumn Header="InsertedHeader6" Width="1.5*" Binding="{Binding Name}" IsReadOnly="False" /> 
           </DataGrid.Columns> 
          </DataGrid> 

          <!-- Simply value, if nested DataGrid will be Hidden --> 
          <TextBlock Name="SimpleValue" Text="{Binding Name}" Visibility="Hidden" /> 
         </Grid> 

         <DataTemplate.Triggers> 
          <!-- It checks for Hidden NestedDataGrid --> 
          <DataTrigger Binding="{Binding ShowInsertedGrid}" Value="Hidden"> 
           <Setter TargetName="InsertedDataGrid2" Property="Visibility" Value="Collapsed" /> 
           <Setter TargetName="SimpleValue" Property="Visibility" Value="Visible" /> 
          </DataTrigger> 
         </DataTemplate.Triggers> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 

哪裏InsertedDataGrid2_Loaded您設置的數據:

private void InsertedDataGrid2_Loaded(object sender, RoutedEventArgs e) 
    { 
     DataGrid MyDataGrid = sender as DataGrid; 

     DataForInsertedDataGrid2.Add(new Person() 
     { 
      Name = "Bob2", 
      Age = 215, 
     }); 

     DataForInsertedDataGrid2.Add(new Person() 
     { 
      Name = "SpanchBob2", 
      Age = 251, 
     }); 

     MyDataGrid.ItemsSource = DataForInsertedDataGrid2; 
    } 

對於使用DataGrid每一列,你爲它加載數據的代碼。因此,計算主要和嵌套DataGrid的總列數。

+0

非常感謝您的回答。這幾乎就是我想要實現的。唯一的是你添加嵌套的DataGrid在一個單元中,而我需要在整行中添加嵌套的DataGrid。 –

+0

感謝您的編輯,但事實上這絕對不是最好的解決方案,而不是我需要的行爲。不管怎麼說,還是要謝謝你! –