2012-01-26 3 views
2

WPF DataGrid에 조건부 서식을 적용하려고합니다. 요구 사항은 다음과 같습니다. 표의 모든 셀에 대해 내용이 정수인 경우 표시 형식은 소수점 이하 자릿수 여야합니다. 내용에 소수 자릿수가 있으면 문자열 서식에 정의 된 기본값으로 표시하십시오.WPF DataGridCell의 조건부 서식

아무도 이런 종류의 조건부 서식을 얻을 수있는 방법에 대한 아이디어가 있습니까? 십진수의 존재를 확인할 수있는 변환기를 작성했지만 XAML에서 이것을 셀 스타일이나 텍스트 열에 적용 할 수있는 방법을 찾지 못했습니다.

셀 스타일 -이 칼럼에 적용된 스타일을 적용 할 것

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

변환기 - - 내가 사용하는 것이이 내가 원하는 스타일이

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

그리드 열을 정의하는 것입니다 변환기를 사용하여이 스타일의 적용 여부를 결정합니다.

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를 추가하여하려고 노력하지만 유형 'System.Windows.Controls.DataGridCell'에 스타일 속성 '있는 StringFormat'를 찾을 수 없습니다 "라는 오류가 발생했습니다. "

<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를 구문 분석하고 성공하면이를 반환합니다. 그렇지 않다면, double을 시도하고 그것을 반환 할 것입니다. 여기에 원하는 소수 자릿수를 얻기 위해 문자열 형식을 지정할 수 있습니다. 마지막으로, 구문 분석 할 수없는 경우 원래 값을 반환합니다.

그런 다음 사용하여 열에 것을 설정할 수 있습니다

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

참고 : 당신이 MyConverter의 키를 사용하여 자원에 어딘가에 컨버터를 인스턴스화해야합니다.

기본 소수 자릿수를 지정할 수 있도록하려면 변환기 매개 변수로 전달하면됩니다.

+0

대단히 감사합니다. 그것은 내가 필요한만큼 정확하게 작동했습니다. – DB101