Question

J'essaie d'appliquer une mise en forme conditionnelle sur un dataGrid WPF.La exigence est la suivante. Pour toute cellule sur la grille, si le contenu est un entier, le format d'affichage doit être décimal zéro. Si le contenu a des décimales, affichez-les à la valeur par défaut définie dans le stringformat.

Quelqu'un a-t-il une idée de la façon 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 pu comprendre comment je pourrais l'appliquer dans mon XAML à mon style de portable ou à ma colonne de texte.

Style cellulaire - c'est le style que je voudrais définir

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

Colonne de grille - J'appliquerais 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 datatrigger à mon style de cellule comme ci-dessous, mais j'ai eu une erreur indiquant "Impossible de trouver la propriété de style 'StringFormat' sur le 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>

Je me frappe la tête depuis des jours, donc tout conseil serait apprécié quant à la meilleure façon de l'approcher.

Était-ce utile?

La solution

Votre convertisseur renvoie actuellement un booléen pour indiquer s'il pourrait ou non analyser un entier à partir de la valeur de chaîne. Au lieu de cela, vous devriez 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();
    }
}

Cela essaiera d'abord d'analyser un INT et de le renvoyer (en tant que chaîne) en cas de succès. Sinon, il essaiera un double et le renverra - ici, vous pouvez spécifier n'importe quel format de chaîne pour obtenir le nombre souhaité de décimales, etc. Enfin, s'il ne peut pas analyser soit il renverra la valeur d'origine.

Vous pouvez ensuite régler cela sur votre colonne en utilisant:

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

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

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top