Условное форматирование в WPF DataGridCell - PullRequest
2 голосов
/ 26 января 2012

Я пытаюсь применить условное форматирование к WPF DataGrid. Требование заключается в следующем. Для любой ячейки в сетке, если содержимое является целым числом, формат отображения должен быть ноль десятичных знаков. Если содержимое имеет десятичные разряды, отобразите их по умолчанию, определенному в строковом формате.

Кто-нибудь знает, как мне добиться такого условного форматирования? Я написал конвертер, который может проверять наличие десятичных дробей, но я не смог понять, как я смогу применить это в своем XAML либо к стилю ячейки, либо к моему текстовому столбцу.

Стиль ячейки - это стиль, который я хотел бы определить

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

Столбец сетки - я бы применил стиль, примененный к этому столбцу

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

Конвертер - я бы использовал этот конвертер, чтобы определить, применяется ли этот стиль.

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();
        }
    }

Я попытался сделать это, добавив источник данных в стиль своей ячейки, как показано ниже, но получил сообщение об ошибке «Не удается найти свойство стиля« StringFormat »для типа« 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>

Я уже несколько дней бьюсь головой об этом, поэтому мы будем благодарны за любые указания относительно наилучшего способа приблизиться к этому.

1 Ответ

4 голосов
/ 26 января 2012

Ваш конвертер в настоящее время возвращает логическое значение, чтобы указать, может ли он анализировать целое число из строкового значения. Вместо этого вы должны попробовать что-то вроде этого:

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();
    }
}

Сначала попытается проанализировать int и вернуть его (в виде строки) в случае успеха. Если нет, он попытается удвоить и вернуть его - здесь вы можете указать любой формат строки, чтобы получить желаемое количество десятичных разрядов и т. Д. Наконец, если он также не может выполнить синтаксический анализ, он вернет исходное значение.

Затем вы можете установить это для своего столбца, используя:

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

Примечание: вам нужно будет создать экземпляр вашего конвертера где-то на ресурсах с ключом MyConverter.

Если вы хотите указать количество десятичных знаков по умолчанию, вы можете передать его в качестве параметра конвертера.

...