2012-06-08 162 views
10

我試圖改變一個DataGridTextColumn的顏色。如何設置DataGridTextColumn文本顏色?

下面是我在做什麼:

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

文本設置正確,但顏色不會改變,我得到以下錯誤:

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') 

我應該怎麼辦爲了這個工作?

+0

您是否打算爲整列或單個細胞設置背景? – Phil

+0

我想爲個別單元格設置FOREGROUND –

回答

9

您需要爲列的CellStyle指定一個包含DataTrigger的樣式。例如

<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

活動可能爲空。我如何指定? –

+1

@ArsenZahray:爲null添加觸發器。我假設你的狀態轉換器處理空值。 – Phil

+0

道歉,因爲我是WPF的新手。我的代碼中的「Converters」標記有未解決的符號錯誤,我還需要定義哪些其他代碼? – Danielle

0

前景是一個畫筆,而不是顏色。它可以用解析 XAML中的一種顏色,但當您使用轉換器創建綁定時不會使用這種顏色。

使用BoolToBrushConverter,或創建一個SolidColorBrush作爲前景並將其「Color」屬性綁定到BoolToColorConverter。像這樣:

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

我注意到了,但是我的問題是,WPF確實在綁定中看到屬性IsActive,並且在前景中看不到它。與此同時,我修改了BoolToColorConverter以返回實體畫筆而不是顏色 –

7

雖然技術上不是DataGridTextColumn,這是我平時做:

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

我得到我想要的DataContext的,我可以resuse,我可能已經到位,其餘轉換器的應用程序。此外,我不必硬編碼/維護一組額外的樣式和數據觸發器以獲得所需的效果。