2012-08-07 18 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と答え、見つけた:そこに私の95%を取得し

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

を、私は欠けている最後のピースは、データバインディングを処理する方法ですか?テンプレートにいくつかのタイプのプレースホルダを作成してから、グリッドで実際のバインディングを実行するにはどうすればよいですか?

EDIT は、私が見ていると私は実際には現在できない場合があります何をしたいかのように聞こえる質問Create Common DataGridTemplateColumnを発見し続けてきました。だから他の誰かがこれをしようとしていると私はそれが不可能であることを保証することはできませんが、このリンクを見ることができますこのような質問が表示されます。だから、すべての列のすべてのtempalteコードを複製する必要があります。

答えて

6

CellStyleプロパティは、DataGridCellの場合はTemplateを上書きするスタイルに設定できます。 Template

、あなたはTemplatedParentは、例えばDataGridCell

であることから、DataGridCellのコンテンツを配置したい場所に、

<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

はそれがために可能でしょうTemplatedParent.ContentにバインドされているContentPresenterを使用ContentPresenterは近くのリソースに定義されたDataTemplateを使用しますか? –

関連する問題