2016-06-27 11 views
1

Ich bin ziemlich neu in WPF und ich kann nicht zwei verschiedene Steuerelement Vorlage für die Spalten eines DataGrid verwenden (das wird immer 2 Spalten haben). Diese ist die XAML des Datagrid:Wie man verschiedene Stile auf DataGrid-Spalten anwendet

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

Ich verwende die Eigenschaft AutoGeneratingColumn eine bestimmte Spalte zu entfernen und bearbeiten Sie die Spalten Header

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"; 
    } 
} 

Dies sind die Content-Vorlagen i verwenden möchten die erste für die ersten Spalten und die zweite für die zweite offensichtlich: 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> 

Wie ich dies erreichen können?

Antwort

1

sender des Ereignisses ist DataGrid, und DataGrid kann Zellstil in seiner visuellen Struktur finden. Dann können Sie diesen Stil Spalten zuweisen individuell:

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

dieser Art verwendet Typ als Schlüssel, wird es DataGridCells vorbelegt werden, keine Notwendigkeit, sie setzen sich ausdrücklich von Code hinter

+0

Vielen Dank! Dies wirkt wie ein Zauber für die zweite Spalte, aber scheint, dass die erste Spalte ihren Stil "verliert": Der Text sollte zentriert sein, aber wenn er auf die zweite Spalte angewendet wird, wird er linksbündig: S – Sempri92

+0

@ Sempri92, '