2012-08-07 80 views
10

在WPF數據網格中,我有一列定義爲DataGridTemplateColumn,我需要在各種列上使用它。作爲一個非常簡單的例子,請考慮下面的虛擬樣品:如何重用WPF DataGridTemplateColumn(包括綁定)

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

舉個簡單的例子,我怎麼能申請用於與標題=名稱欄與標題=公司列相同的模板,而不必重現每一列的整個模板?

我發現this previous SO question一個答案,他們解釋使用的資源,如:

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

這讓我95%在那裏,但我錯過了最後一塊是如何處理的數據綁定?如何在模板中創建某種類型的佔位符,然後在網格中進行實際綁定?

編輯 我一直在尋找,發現這聽起來像什麼,我想要做的可能實際上是不可能的目前問題Create Common DataGridTemplateColumn。所以如果有人試圖做到這一點,並看到這個問題,我不能保證這是不可能的,但從這個鏈接看來可能是。所以只需要複製每列的所有tempalte代碼。

回答

6

您可以將CellStyle屬性設置爲覆蓋DataGridCellTemplate的樣式。

Template,使用綁定,無論你要放置DataGridCell的內容TemplatedParent.Content一個ContentPresenter,因爲TemplatedParentDataGridCell

例如,

<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

請問它有可能ContentPresenter使用在附近某處資源中定義的DataTemplate? – 2014-12-15 13:36:29

相關問題