2012-01-26 3 views
2

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

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

Cell Style - Это стиль, который я хотел бы определить

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

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

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

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

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

ответ

3

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

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.

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

+0

спасибо. Это работало именно так, как мне было нужно. – DB101

Смежные вопросы