2012-04-05 3 views
1

Ich möchte Textfarbe der Zellen basierend auf Wert ändern, die Zelle enthält Ich verwende einen Wertkonverter, aber irgendwie der Typ des Objekts, das an Convert-Funktion übergeben wird, ist DataRowView und Ich möchte die Zelle weitergeben, weil ich auf der Grundlage ihres Wertes eine Zelle auf einmal beleuchten möchte. Hoffnung, die Sinn macht.wpf Farbe die Zellen in DataGrid Basierend auf Wert

Danke !!

-Code, wenn Stil, den ich Datagrid anwenden:

<UserControl.Resources> 
    <local:MyBkColorConverter x:Key="bkColorCvrt"/> 
    <Style x:Key="GridStyle" TargetType="DataGrid"> 
     <Setter Property="ItemsSource" Value="{Binding}" /> 
     <Setter Property="Background" Value="Transparent" /> 
     <Setter Property="RowBackground" Value="Transparent" /> 
     <Setter Property="HeadersVisibility" Value="None" /> 
     <Setter Property="GridLinesVisibility" Value="None" /> 
     <Setter Property="SelectionUnit" Value="Cell" /> 
     <Setter Property="SelectionMode" Value="Single" /> 
     <Setter Property="IsReadOnly" Value="True" /> 
     <Setter Property="HorizontalScrollBarVisibility" Value="Disabled" /> 
     <Setter Property="CellStyle"> 
      <Setter.Value> 
       <Style TargetType="{x:Type DataGridCell}"> 
        <Setter Property="Foreground"> 
         <Setter.Value> 
          <Binding Converter="{StaticResource bkColorCvrt}"/> 
         </Setter.Value> 
        </Setter> 
        <Style.Triggers> 
         <Trigger Property="IsSelected" Value="True"> 
          <Setter Property="Background" Value="Black"> 
          </Setter> 
         </Trigger> 
        </Style.Triggers> 
       </Style> 
      </Setter.Value> 
     </Setter> 
     </Style> 
</UserControl.Resources> 

und die C# Teil:

public class MyBkColorConverter: IValueConverter { #region IValueConverter Mitglieder

public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     //The type of value here is actually DataRowView 
     //here i would like to have a cell passed. is that possible to archive? 
     return Brushes.LightGray; 
    } 

    public object ConvertBack(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 
} 

Antwort

2

Wenn Sie einen Stil erstellen, der auf jedes Steuerelement angewendet wird, entspricht er diesem Typ.

Verwenden Sie einfach die DataGridTemplateColumn und erstellen Sie Ihre benutzerdefinierte Vorlage, die Sie tun können, wie Sie möchten.

<DataGridTemplateColumn Header="Name">      
     <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <TextBlock Foreground="{Binding Name,Converter={StaticResource colconverter}}" Text="{Binding Name}" /> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
    </DataGridTemplateColumn> 
+0

Mein Gitter ist an DataTable gebunden, daher definiere ich selbst keine Spalten. Wo füge ich diesen Code ein? – Anya

+0

Wenn Sie wissen, welche Spalten zu Ihrer Quellzeile gehören, können Sie sie wie oben beschrieben binden. Zum Beispiel haben Sie Mitarbeiter Datentabelle und Name ist die Spalten, dann wird das obige gut funktionieren. – JSJ

1

Es funktioniert, wenn Sie einen Path auf die Eigenschaft übergeben, die in der Binding umgewandelt werden muss.

<DataGridTextColumn Binding="{Binding Path=AgentUtilization, StringFormat=P}" Header="Agent Utilization"> 
    <DataGridTextColumn.CellStyle> 
     <Style TargetType="DataGridCell"> 
      <Setter Property="Foreground" Value="{Binding Path=AgentUtilization, Converter={StaticResource UtilizationFormat}}" /> 
     </Style> 
    </DataGridTextColumn.CellStyle> 
</DataGridTextColumn> 

Der Typ, der an den Konverter übergeben wird ist dann die Art der Immobilie in Ihrem verbindlichen Pfad (natürlich nach der Besetzung).

+0

danke ich werde versuchen – Anya

+0

Mein Gitter ist an DataTable gebunden, so dass ich selbst keine Spalten definieren. Wo füge ich diesen Code ein? – Anya