/ / Comment appliquer différents styles aux colonnes de la grille de données - wpf, datagrid, styles, controltemplate

Comment appliquer différents styles aux colonnes de la grille de données - wpf, datagrid, styles, controltemplate

Je suis assez nouveau pour WPF et je ne sais pas comment utiliser deux modèles de contrôle différents pour les colonnes d'une grille de données (qui aura toujours 2 colonnes). C'est le XAML du DataGrid:

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

J'utilise la propriété AutoGeneratingColumn pour supprimer une colonne spécifique et modifier les en-têtes de colonnes

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

Ce sont les modèles de contenu que je veux utiliser, le premier pour les premières colonnes et le second pour les seconds évidemment: 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>

Comment puis-je atteindre cet objectif?

Réponses:

1 pour la réponse № 1

sender DataGrid est l’un des événements, et DataGrid peut trouver le style de cellule dans son arborescence visuelle. Ensuite, vous pouvez affecter ce style aux colonnes individuellement:

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

ce style utilise le type comme clé, il sera affecté à DataGridCells par défaut, il n'est pas nécessaire de le définir explicitement à partir du code situé derrière