2012-08-07 29 views
10

Nei datagrids WPF, ho una colonna definita come DataGridTemplateColumn che dovrò utilizzare su tutti i tipi di colonne. Come un esempio molto semplificato perche il seguito come un esempio fittizio:Come riutilizzare WPF DataGridTemplateColumn (incluso il binding)

<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> 

Per un semplice esempio, come ho potuto applicare lo stesso modello utilizzato per la colonna con l'intestazione = Nome alla colonna con l'intestazione = Società senza dover riprodurre l'intero modello per ogni colonna?

ho trovato una risposta con this previous SO question, in cui spiegano che utilizzano risorse come:

<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> 

Questo mi arriva al 95% lì, ma l'ultimo pezzo che mi manca è il modo di trattare i dati vincolanti? Come creo qualche tipo di segnaposto nel modello e poi eseguo il binding effettivo nella griglia?

EDIT ho continuato a guardare e ha trovato la domanda Create Common DataGridTemplateColumn che suona come quello che voglio fare può infatti essere impossibile al momento. Quindi, se qualcun altro ha mai provato a farlo, e vede questa domanda, non posso garantire che sia impossibile, ma da questo collegamento sembra che lo sia. Quindi sarà sufficiente duplicare tutto il codice temporaneo per ogni colonna.

risposta

6

È possibile impostare la proprietà CellStyle su uno stile che sovrascrive lo Template per DataGridCell.

Nel Template, utilizzare un ContentPresenter che è legato al TemplatedParent.Content dove si vuole posizionare il contenuto del DataGridCell, dal momento che la TemplatedParent è la DataGridCell

Per esempio,

<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

Sarebbe possibile per ContentPresenter per utilizzare un DataTemplate definito in risorse da qualche parte nelle vicinanze? –