2 votes

Formatage conditionnel dans les cellules de la grille de données WPF

J'essaie d'appliquer un formatage conditionnel à une grille de données WPF. Pour toute cellule de la grille, si le contenu est un entier, le format d'affichage doit être zéro décimale. Si le contenu a des décimales, il faut les afficher avec la valeur par défaut définie dans le stringformat.

Quelqu'un a-t-il une idée de la manière dont je pourrais réaliser ce type de formatage conditionnel ? J'ai écrit un convertisseur qui peut vérifier l'existence de décimales, mais je n'ai pas réussi à trouver comment je pourrais l'appliquer dans mon XAML à mon style de cellule ou à ma colonne de texte.

Style de cellule - Il s'agit du style que je souhaite définir.

<Style x:Key="MyCellStyle" TargetType="DataGridCell">
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
    <Setter Property="VerticalContentAlignment" Value="Center"/>
</Style>

Colonne de la grille - Je voudrais appliquer le style appliqué à cette colonne

<DataGridTextColumn x:Key="ColumnName"
                    Header="ColumnName"
                    SortMemberPath="MyColumnSort"
                    Binding="{Binding myColBinding, StringFormat={}{0:N2}}"
                    IsReadOnly="True"
                    Width="40" />

Convertisseur - J'utiliserais ce convertisseur pour déterminer si ce style est appliqué.

public class NoDecimalConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            int converted;
            int.TryParse(value.ToString(), out converted);
            value.ToString();
            return int.TryParse(value.ToString(), out converted);
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

J'ai essayé de le faire en ajoutant un déclencheur de données au style de ma cellule, comme indiqué ci-dessous, mais j'ai obtenu une erreur indiquant "Cannot find the Style Property 'StringFormat' on the type 'System.Windows.Controls.DataGridCell'".

    <Style x:Key="MyCellStyle" TargetType="DataGridCell">
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
    <Setter Property="VerticalContentAlignment" Value="Center"/>
        <Style.Triggers>             
            <DataTrigger Binding="{Binding NoDecimalConvertor}" Value="False" >                 
                <Setter Property="StringFormat" Value="true" />             
            </DataTrigger>         
        </Style.Triggers>     
</Style>

Cela fait des jours que je me heurte à cette question et je vous serais reconnaissant de m'indiquer la meilleure façon d'aborder ce problème.

4voto

Steve Greatrex Points 8466

Votre convertisseur renvoie actuellement un booléen pour indiquer s'il a pu ou non analyser un entier à partir de la valeur de la chaîne. Vous devriez plutôt essayer quelque chose comme ceci :

public class NoDecimalConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        int converted;
        if (int.TryParse(value.ToString(), out converted))
             return converted.ToString();

        double convertedDouble;
        if (double.TryParse(value.ToString(), out convertedDouble))
             return convertedDouble.ToString();

        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Il essaiera d'abord d'analyser un int, et le renverra (sous forme de chaîne de caractères) en cas de succès. Si ce n'est pas le cas, il essaiera d'analyser un double et le renverra - ici, vous pouvez spécifier n'importe quel format de chaîne pour obtenir le nombre désiré de décimales, etc. Enfin, s'il ne peut analyser aucun des deux, il renverra la valeur originale.

Vous pouvez ensuite le définir dans votre colonne en utilisant :

<DataGridTextColumn x:Key="ColumnName"
                Header="ColumnName"
                SortMemberPath="MyColumnSort"
                Binding="{Binding myColBinding, Converter={StaticResource MyConverter}}"
                IsReadOnly="True"
                Width="40" />

Note : vous devrez instancier votre convertisseur quelque part dans les ressources avec une clé de MyConverter .

Si vous souhaitez pouvoir spécifier un nombre de décimales par défaut, vous pouvez le transmettre en tant que paramètre du convertisseur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X