2012-06-08 20 views
10

Estoy intentando cambiar el color de un DataGridTextColumn.Cómo establecer el color de texto DataGridTextColumn?

Esto es lo que estoy haciendo:

<DataGridTextColumn 
    Header="Status" 
    Binding="{Binding IsActive, 
       Converter= {StaticResource BoolToStatusConverter}}" 
    Foreground="{Binding Path=IsActive, 
       Converter={StaticResource BoolToColorConverter}}"/> 

texto está definida correctamente, pero el color no va a cambiar, y me estoy poniendo siguiente error:

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or 
FrameworkContentElement for target element. BindingExpression:Path=IsActive; 
DataItem=null; target element is 'DataGridTextColumn' (HashCode=40349079); target 
property is 'Foreground' (type 'Brush') 

¿Qué debo hacer para que esto funcione?

+0

¿Está tratando de establecer el fondo para toda la columna, o celdas individuales en una columna? – Phil

+0

Estoy tratando de establecer FOREGROUND para celdas individuales –

Respuesta

9

Debe especificar un Estilo con un DataTrigger para el CellStyle de la columna. p.ej.

<Page.Resources> 
    <Style TargetType="DataGridCell" x:Key="ActiveCellStyle"> 
     <Setter Property="Foreground" Value="Blue"/> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding IsActive}" Value="{x:Null}"> 
       <Setter Property="Foreground" Value="Green"/> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding IsActive}" Value="True"> 
       <Setter Property="Foreground" Value="Red"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
    <Converters:BoolToTextConverter 
     x:Key="BoolToStatusConverter" 
     TargetCondition="True" 
     IsMatchValue="It's active" 
     IsNotMatchValue="It's dead" /> 
</Page.Resources> 
<Grid> 
    <DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False"> 
     <DataGrid.Columns> 
      <DataGridTextColumn 
       Header="Status" 
       Binding="{Binding IsActive, 
        Converter={StaticResource BoolToStatusConverter}}" 
       CellStyle="{StaticResource ActiveCellStyle}"/> 
     </DataGrid.Columns> 
    </DataGrid> 
</Grid> 
+0

Está activo puede ser nulo. ¿Cómo especifico eso? –

+1

@ArsenZahray: disparador agregado para null. Supongo que su convertidor de estado maneja nulos. – Phil

+0

Disculpas, ya que soy nuevo en WPF. Tengo un error de símbolo no resuelto para la etiqueta "Convertidores" en su código, ¿qué otro código necesito definir? – Danielle

0

El primer plano es un pincel, no un color. Puede analizar un color en XAML, pero no se usa cuando se crea un enlace con un convertidor.

Usa un BoolToBrushConverter, o crea un SolidColorBrush como primer plano y vincula su propiedad "Color" al BoolToColorConverter. De la misma manera:

<DataGridTextColumn Header="Status"> 
    <DataGridTextColumn.Foreground> 
     <SolidColorBrush Color="{Binding Path=IsActive, Converter={StaticResource BoolToColorConverter}}" /> 
    </DataGridTextColumn.Foreground> 
</DataGridTextColumn> 
+1

Me he dado cuenta de eso, pero mi problema es que WPF ve la propiedad IsActive en Enlace y no la ve en primer plano. Mientras tanto, modifiqué BoolToColorConverter para devolver pinceles sólidos en lugar de colores –

7

Aunque no es técnicamente un DataGridTextColumn, esto es lo que suele hacer:

<DataGridTemplateColumn Header="Status" SortMemberPath="Status"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Status}" Foreground="{Binding Status, Converter={StaticResource StatusToSolidColor}}" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 

tengo la DataContext que yo quiero, y yo puedo resuse convertidores que ya tenga en su lugar en el resto de la aplicación. Además, no tengo que codificar/mantener un conjunto adicional de estilos y activadores de datos para obtener el efecto deseado.

Cuestiones relacionadas