2017-05-23 3 views
0

DataGridCell 값을 Foreground 속성 변환기로 전달하려면 어떻게해야합니까?C# DataGrid Cell의 값을 변환기로 전달하는 방법은 무엇입니까?

그래서 GooglePositionConvertor은 Path =로 전달 된 개체에서 생성 된 값을 반환합니다. 그러나 GooglePositionConvertor에 의해 반환 된 값을 기반으로 셀 스타일의 전경색을 변경하고 싶습니다.

<DataGridTextColumn Binding="{Binding Path=., Converter={StaticResource GooglePositionConvertor}}"> 
    <DataGridTextColumn.CellStyle> 
     <Style TargetType="{x:Type DataGridCell}"> 
      <Setter Property="Foreground" Value="{????????????, Converter={StaticResource ChangeBrushColour}}"/> 
     </Style> 
    </DataGridTextColumn.CellStyle> 
</DataGridTextColumn> 

답변

1

바인딩 경로를 지정하지 마십시오. 포어 그라운드 속성은 DataGridCell의 DataContext를 바인딩 소스로받습니다.

<DataGrid ItemsSource="{Binding ColorList}" AutoGenerateColumns="False"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Binding="{Binding}"> 
      <DataGridTextColumn.CellStyle> 
       <Style TargetType="{x:Type DataGridCell}"> 
        <Setter Property="Foreground" Value="{Binding Converter={StaticResource ColorToBrush}}"/> 
       </Style> 
      </DataGridTextColumn.CellStyle> 
     </DataGridTextColumn> 
    </DataGrid.Columns> 
</DataGrid> 
+0

첫 번째 변환기 인 "GooglePositionConvertor"의 행에 바인딩 된 개체가 필요하지만 th의 셀 값만 필요합니다. e 두 번째 변환기 "ChangeBrushColour". – jamie

0
당신은 DataGridCellContent 속성에 바인딩하고 Text 속성이 설정되고 나면 TextBlockForeground 속성을 설정할 수하기 위해 DependencyPropertyDescriptor을 사용할 수

:

<DataGridTextColumn Binding="{Binding Path=., Converter={StaticResource GooglePositionConvertor}}"> 
    <DataGridTextColumn.CellStyle> 
     <Style TargetType="{x:Type DataGridCell}"> 
      <Setter Property="Foreground" Value="{Binding Path=Content, RelativeSource={RelativeSource Self}, 
       Converter={StaticResource ChangeBrushColour}}"/> 
     </Style> 
    </DataGridTextColumn.CellStyle> 
</DataGridTextColumn> 

public class Converter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     TextBlock content = value as TextBlock; 
     if(content != null) 
     { 
      string text = content.Text; 
      if(string.IsNullOrEmpty(text)) 
      { 
       DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor.FromProperty(TextBlock.TextProperty, typeof(TextBlock)); 
       if (dpd != null) 
        dpd.AddValueChanged(content, OnTextChanged); 
      } 
      else 
      { 
       OnTextChanged(content, EventArgs.Empty); 
      } 
     } 
     return Binding.DoNothing; 
    } 

    private void OnTextChanged(object sender, EventArgs e) 
    { 
     TextBlock textBlock = sender as TextBlock; 
     string converterText = textBlock.Text; 
     //set foreground based on text... 
     textBlock.Foreground = Brushes.Violet; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 
}