2012-08-07 8 views
10

In WPF-Datagrids habe ich eine Spalte definiert als DataGridTemplateColumn, die ich für alle Arten von Spalten verwenden muss. Als sehr vereinfachtes Beispiel bitte die unten als Dummy-Probe betrachten:Wie WPF DataGridTemplateColumn (einschließlich Bindung) wiederverwendet wird

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

Für ein einfaches Beispiel, wie könnte ich die gleiche Vorlage für Spalte mit Kopf = Name auf die Säule mit Kopf = Unternehmen verwendet gelten, ohne mit die gesamte Vorlage für jede Spalte reproduzieren?

Ich habe eine Antwort mit this previous SO question, wo sie erklären, mit Ressourcen wie gefunden:

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

Das bin ich 95% dort ankommt, aber das letzte Stück ist mir persönlich fehlt, wie verbindlich die Daten zu handhaben? Wie erstelle ich einen Typ von Platzhalter in der Vorlage und mache dann die tatsächliche Bindung im Raster?

EDIT Ich habe gehalten Suche und fand die Frage Create Common DataGridTemplateColumn, die so klingt, was ich will in der Tat zu tun, kann zur Zeit nicht möglich. Wenn also jemand anderes versucht, dies zu tun und diese Frage zu sehen, kann ich nicht garantieren, dass es unmöglich ist, aber aus dieser Verbindung scheint es vielleicht zu sein. Es muss also nur der gesamte Tempaltext für jede Spalte dupliziert werden.

Antwort

6

Sie können die CellStyle-Eigenschaft auf einen Stil setzen, der die Template für die DataGridCell überschreibt.

Im Template, verwenden Sie einen ContentPresenter, die dem TemplatedParent.Content gebunden ist, wo Sie die Datagridcell-Content platzieren möchten, da die TemplatedParent die DataGridCell

Zum Beispiel ist,

<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

es möglich wäre, ContentPresenter, um ein DataTemplate zu verwenden, das in Ressourcen in der Nähe definiert ist? –