2013-05-22 11 views
5

Vorrei avere più di una proprietà in una colonna come il seguente:Mostrando più intestazioni in una colonna con DataGrid

DataGrid with more than one header in a column.

Ora, è facile creare un modello di cellulare per mostrare più di una proprietà, ma come si fa a creare un modello di intestazione che mostri più di una proprietà che consente di ordinare facendo clic su di essi? Quindi dovresti essere in grado di ordinare per nome semplicemente facendo clic sull'intestazione First Name e lo stesso vale per tutte le altre proprietà.

+0

http://stackoverflow.com/questions/6469303/sort-on-multiple-columns-in-wpf-datagrid potrebbe essere utile – Frank59

risposta

3

È possibile utilizzare due TextBlock. Nella proprietà Tag è necessario trasferire il nome della proprietà dalla classe di dati. Questa stringa dalla proprietà Tag verrà utilizzata per impostare SortMemberPath. Nel caso MouseLeftButtonDown è possibile ottenere dal Tag il nome della proprietà di ordinamento effettiva e assegnarlo a SortMemberPath.

<DataGrid Name="dataGrid1" ItemsSource="{Binding}" AutoGenerateColumns="False" Margin="0,0,0,52"> 
    <DataGrid.Columns> 
     <DataGridTemplateColumn> 
      <DataGridTemplateColumn.HeaderTemplate > 
       <DataTemplate> 
        <Grid ShowGridLines="True"> 
         <Grid.RowDefinitions> 
          <RowDefinition /> 
          <RowDefinition /> 
         </Grid.RowDefinitions> 
         <TextBlock Text="First Name" Tag="FirstName" MouseLeftButtonDown="TextBlock_MouseLeftButtonDown" /> 
         <TextBlock Text="Last Name" Grid.Row="1" Tag="LastName" MouseLeftButtonDown="TextBlock_MouseLeftButtonDown" />         
        </Grid>   
       </DataTemplate> 
      </DataGridTemplateColumn.HeaderTemplate> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <Grid> 
         <Grid.RowDefinitions> 
          <RowDefinition /> 
          <RowDefinition /> 
         </Grid.RowDefinitions> 
         <TextBox Text="{Binding FirstName}"/> 
         <TextBox Text="{Binding LastName}" Grid.Row="1" /> 
        </Grid> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
     <DataGridTextColumn Header="Age" Binding="{Binding Age}" /> 
    </DataGrid.Columns> 
</DataGrid> 

Codice-behind:

private void TextBlock_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    TextBlock s = sender as TextBlock; 
    string sortPath = s.Tag as string; 
    dataGrid1.Columns[0].SortMemberPath = sortPath; 
} 

È inoltre possibile aggiungere TextBlock stile se si desidera visualizzare cui la proprietà è attualmente l'ordinamento proprietà e dei caratteri in grassetto.

<DataGridTemplateColumn.HeaderTemplate > 
    <DataTemplate> 
     <Grid ShowGridLines="True"> 
      <Grid.RowDefinitions> 
       <RowDefinition /> 
       <RowDefinition /> 
      </Grid.RowDefinitions> 
      <TextBlock Text="First Name" Tag="FirstName" MouseLeftButtonDown="TextBlock_MouseLeftButtonDown"> 
       <TextBlock.Style> 
        <Style TargetType="TextBlock"> 
         <Setter Property="FontWeight" Value="Normal" /> 
         <Style.Triggers> 
          <DataTrigger Binding="{Binding Path=Columns[0].SortMemberPath, ElementName=dataGrid1}"> 
           <DataTrigger.Value> 
            <sys:String>FirstName</sys:String> 
           </DataTrigger.Value> 
           <Setter Property="FontWeight" Value="Bold" /> 
          </DataTrigger>        
         </Style.Triggers> 
        </Style> 
       </TextBlock.Style> 
      </TextBlock> 
      <TextBlock Text="Last Name" Grid.Row="1" Tag="LastName" MouseLeftButtonDown="TextBlock_MouseLeftButtonDown" > 
       <TextBlock.Style> 
        <Style TargetType="TextBlock"> 
         <Setter Property="FontWeight" Value="Normal" /> 
         <Style.Triggers> 
          <DataTrigger Binding="{Binding Path=Columns[0].SortMemberPath, ElementName=dataGrid1}"> 
           <DataTrigger.Value> 
            <sys:String>LastName</sys:String> 
           </DataTrigger.Value> 
           <Setter Property="FontWeight" Value="Bold" /> 
          </DataTrigger> 
         </Style.Triggers> 
        </Style> 
       </TextBlock.Style> 
      </TextBlock> 
     </Grid>   
    </DataTemplate> 
</DataGridTemplateColumn.HeaderTemplate> 

Dove sys è seguente spazio dei nomi:

xmlns:sys="clr-namespace:System;assembly=mscorlib" 
0

Date un'occhiata a this example of StringFormat:

e cambiare l'intestazione della colonna DataGrid, come nell'esempio qui sotto:

<DataGrid> 
     <DataGrid.Columns> 
     <DataGridTemplateColumn> 
      <DataGridTemplateColumn.Header> 
      <TextBlock HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
       <TextBlock.Text> 
        <MultiBinding StringFormat="{}{1}{0}{2}"> 
         <Binding Source="{x:Static sys:Environment.NewLine}"/> 
         <Binding Path="FirstName" /> 
         <Binding Path="LastName"/> 
        </MultiBinding> 
      </TextBlock> 
      </DataGridTemplateColumn.Header> 
     </DataGrid.Columns> 
     </DataGrid> 

con xmlns:sys="clr-namespace:System;assembly=mscorlib"

Problemi correlati