wpf resources datagridtemplatecolumn

Cómo reutilizar WPF DataGridTemplateColumn(incluido el enlace)



resources (1)

En las redes de datos de WPF, tengo una columna definida como DataGridTemplateColumn que necesitaré usar en todo tipo de columnas. Como ejemplo muy simplificado, considere lo siguiente como una muestra ficticia:

<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 utilizada para la columna con Header = Name a la columna con Header = Company sin tener que reproducir la plantilla completa para cada columna?

Encontré una respuesta con esta pregunta SO anterior , donde explican el uso de 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>

Eso me da un 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?

EDIT He seguido buscando y encontré la pregunta Create Common DataGridTemplateColumn que parece ser lo que 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.


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

En la Template , use un ContentPresenter que esté vinculado al Contenido de Padres TemplatedParent.Content donde quiera colocar el Contenido de DataGridCell, ya que TemplatedParent es 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>