2016-06-27 13 views
1

私はWPFにはかなり新しく、データグリッドの列には2つの異なるコントロールテンプレートを使用する方法がわかりません(常に2列あります)。 これは、DataGridのXAMLです:データグリッド列に異なるスタイルを適用する方法

<DataGrid x:Name="HomeSoftwareGrid" 
      CanUserAddRows="false" 
      ItemsSource="{Binding CollectedSoftwares}" 
      AutoGenerateColumns="True" 
      FontSize="15" 
      ColumnWidth="*" 
      IsReadOnly="True" 
      AutoGeneratingColumn="OnAutoGeneratingColumn" 
      CellEditEnding="OnCellEditEnding" 
      HorizontalAlignment="Center" 
      MaxWidth="600"> 
</DataGrid> 

私は列のヘッダーが特定の列を削除し、編集するプロパティAutoGeneratingColumnを使用してい

private void OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) 
{ 
    PropertyDescriptor propertyDescriptor = (PropertyDescriptor)e.PropertyDescriptor; 
    e.Column.Header = propertyDescriptor.DisplayName; 
    if (propertyDescriptor.DisplayName == "Resources") 
    { 
     e.Cancel = true; 
    } 
    else if (propertyDescriptor.DisplayName == "SoftwareStatus") 
    { 
     e.Column.Header = "Software Status"; 

    } 
    else if (propertyDescriptor.DisplayName == "SoftwareName") 
    { 
     e.Column.Header = "Software Name"; 
    } 
} 

これらは私が使用したいコンテンツテンプレートがあります最初の列の最初の列と2番目の列の列は明らかに次のようになります。D:

<!-- first column style --> 
<Style TargetType="{x:Type DataGridCell}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type DataGridCell}"> 
       <ContentPresenter Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Center" /> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

<!-- second column style --> 
<Style x:Key="SoftwareStatusDataGridColumn" TargetType="{x:Type DataGridCell}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type DataGridCell}"> 
       <Grid HorizontalAlignment="Center"> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="Auto" /> 
         <ColumnDefinition Width="Auto" /> 
        </Grid.ColumnDefinitions> 

        <Rectangle x:Name="ImgPartially" Grid.Column="0" Width="20" Height="20" Fill="Yellow"> 
         <Rectangle.OpacityMask> 
          <VisualBrush Stretch="Uniform" Visual="{StaticResource appbar_warning}" /> 
         </Rectangle.OpacityMask> 
        </Rectangle> 

        <ContentPresenter Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Center" /> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

これはどのように達成できますか?

答えて

1

senderのイベントはDataGridで、DataGridはビジュアルツリーでセルスタイルを検出できます。そして、あなたは個別の列にそのスタイルを割り当てることができます。

else if (propertyDescriptor.DisplayName == "SoftwareName") 
{ 
    e.Column.Header = "Software Name"; 
    e.Column.CellStyle = (sender as FrameworkElement).FindResource("SoftwareStatusDataGridColumn") as Style; 
} 
<Style TargetType="{x:Type DataGridCell}"> 

をこのスタイルがキーとしてタイプを使用して、それは、デフォルトでDataGridCellsに

の後ろのコードから明示的に設定する必要が割り当てられません
+0

ありがとうございました!これは2番目の列の魅力のように機能しますが、最初の列がスタイルを失うように見えます。テキストは中央揃えにする必要がありますが、2番目の欄にスタイルを適用すると左揃えになります。S – Sempri92

+0

@ Sempri92、