2012-08-07 13 views
10

En las cuadrículas de datos WPF, tengo una columna definida como DataGridTemplateColumn que necesitaré utilizar en todo tipo de columnas. Como un ejemplo muy simplificado, por favor considere lo siguiente como muestra de maniquí:Cómo reutilizar WPF DataGridTemplateColumn (incluida la vinculación)

<DataGrid ItemsSource="{Binding Path=ItemList, Mode=OneWay}" AutoGenerateColumns="False" >     
    <DataGrid.Columns> 

     <DataGridTemplateColumn Header="Name" MinWidth="130" Width="Auto"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <DockPanel LastChildFill="True"> 
         <Image Source="component/Images/test.png"/> 
         <TextBlock Text="{Binding Path=Name, Mode=TwoWay, ValidatesOnDataErrors=True}"/> 
        </DockPanel>         
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
      <DataGridTemplateColumn.CellEditingTemplate> 
       <DataTemplate> 
        <DockPanel LastChildFill="True"> 
         <Image Source="component/Images/test.png"/> 
         <TextBox Text="{Binding Path=Name, Mode=TwoWay, ValidatesOnDataErrors=True}"/> 
        </DockPanel> 
       </DataTemplate>        
      </DataGridTemplateColumn.CellEditingTemplate> 
     </DataGridTemplateColumn> 

     <DataGridTextColumn Header="Company" Binding="{Binding Company, ValidatesOnDataErrors=True}" MinWidth="115" Width="Auto"/>      
    </DataGrid.Columns> 
</DataGrid> 

Para un ejemplo simple, ¿cómo podría aplicar la misma plantilla que se utiliza para la columna con el encabezado = Nombre de la columna con encabezado = Empresa sin tener que reproducir la plantilla completa para cada columna?

he encontrado una respuesta con this previous SO question, donde explican utilizando recursos como:

<Application.Resources> 
    <DataTemplate x:Key="CellTemplate"> 
    ... 
    </DataTemplate> 
    <DataTemplate x:Key="CellEdintingTemplate"> 
    ... 
    </DataTemplate> 
</Application.Resources> 

<DataGrid Style="{StaticResource MainGridStyle}"> 
    <DataGrid.Columns> 
     <DataGridTemplateColumn CellTemplate="{StaticResource MyFirstColumnCellTemplate}" CellEdintingTemplate="{StaticResource MyFirstColumnCellEdintingTemplate}"/> 
     ... 
    </DataGrid.Columns> 
<DataGrid> 

que me pone el 95%, pero la última pieza que me falta es cómo manejar el enlace de datos? ¿Cómo creo algún tipo de marcador de posición en la plantilla y luego realizo el enlace real en la cuadrícula?

EDITAR me he mantenido en busca y encuentra la cuestión Create Common DataGridTemplateColumn que suena como lo que yo quiero hacer, de hecho, puede ser imposible actualmente. Entonces, si alguien más está tratando de hacer esto, y ve esta pregunta, no puedo garantizar que sea imposible, pero desde este enlace parece que puede ser. Por lo tanto, solo será necesario duplicar todo el código de tempalte para cada columna.

Respuesta

6

Puede establecer la propiedad CellStyle en un estilo que sobrescribe el Template para el DataGridCell.

En el Template, utilice un ContentPresenter que se une a la TemplatedParent.Content donde desea colocar el Contenido del DataGridCell, ya que el TemplatedParent es el DataGridCell

Por ejemplo,

<Style x:Key="MyCellStyle" TargetType="{x:Type DataGridCell}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate> 
       <DockPanel LastChildFill="True"> 
        <Image Source="component/Images/test.png"/> 
        <ContentPresenter Content="{Binding Content, RelativeSource={RelativeSource TemplatedParent}}" /> 
       </DockPanel> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

<DataGrid ItemsSource="{Binding ItemList}" AutoGenerateColumns="False"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Name" Binding="{Binding Name}" CellStyle="{StaticResource MyCellStyle}" MinWidth="130" Width="Auto" /> 
     <DataGridTextColumn Header="Company" Binding="{Binding Company}" CellStyle="{StaticResource MyCellStyle}" MinWidth="115" Width="Auto"/>      
    </DataGrid.Columns> 
</DataGrid> 
+0

¿Sería posible ¿ContentPresenter usará una DataTemplate definida en recursos en algún lugar cercano? –

Cuestiones relacionadas