2010-06-25 91 views
3

我嘗試構建一個DataGrid,並且我想將TextColums的Foreground屬性之一綁定到Date,以便它在Date變爲過去時變爲紅色。綁定WPF DataGrid文本列的前景

這裏的XAML:

<toolkit:DataGridTextColumn 
    Binding="{Binding Path=Prüfdatum, Converter={StaticResource TimestampToDateConverter}}" 
    Header="Prüfdatum" 
    Foreground="{Binding Path=Prüfdatum, Converter={StaticResource TimestampToColorConverter}, 
    ConverterParameter=Prüfdatum}" /> 

這裏我轉換:

class TimestampToColorConverter: IValueConverter 
{ 
    #region IValueConverter Member 

    public object Convert(object value, Type targetType, 
      object parameter, System.Globalization.CultureInfo culture) 
    { 
     string Datum = value.ToString(); 
     int year = System.Convert.ToInt32(Datum.Substring(6, 4)); 
     int month = System.Convert.ToInt32(Datum.Substring(3, 2)); 
     int day = System.Convert.ToInt32(Datum.Substring(0, 2)); 
     int hour = System.Convert.ToInt32(Datum.Substring(11, 2)); 
     int minute = System.Convert.ToInt32(Datum.Substring(14, 2)); 
     int second = System.Convert.ToInt32(Datum.Substring(17, 2)); 
     DateTime Time = new DateTime(year, month, day, hour, minute, second); 
     if (Time < System.DateTime.Now) 
     { 
      return Brushes.Red as Brush; 
     } 
     else 
     { 
      return Brushes.Black as Brush; 
     } 

    } 

    public object ConvertBack(object value, Type targetType, 
     object parameter, System.Globalization.CultureInfo culture) 
    { 
     return null; 
    } 

    #endregion 
} 

我不知道什麼是錯的,但轉換器甚至沒有caled(第一轉換器完美的作品)。輸出窗口顯示了這個:

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

我希望你能幫助我,夥計們

THX

回答

0

既然你已經綁定到數據網格,從而也不需要沒有必要DataGridTextColumn和ConverterParameter「綁定」的因爲你的轉換器沒有使用參數。下面試試

<toolkit:DataGridTextColumn Header="Prüfdatum" Foreground="{Binding Path=Prüfdatum, Converter={StaticResource TimestampToColorConverter}}" /> 
+0

但我也希望「Prüfdatum」的內容(與我同意的參數,是那朵只有一個測試) – Tokk 2010-06-25 14:42:25

+0

你可以在轉換器中設置一個斷點,看看你是否得到了價值? – Ragunathan 2010-06-29 05:06:32

+0

這就是我發現轉換器沒有在運行時調用的方式 – Tokk 2010-06-29 14:45:17

1

DataGridTextColumn通知DataGrid爲該列中的每一行創建一個TextBlock。 DataGridTextColumn.Binding然後爲TextBlock.Text設置一個綁定,每次創建該行的新行和新TextBlock時都會觸發該綁定。

我不知道曾經的結合得到執行,但最多一次(即不爲每一行):

綁定= 「{綁定路徑=Prüfdatum,轉換器= {StaticResource的TimestampToDateConverter}}」

正確的解決方案是爲該文本塊創建樣式併爲ForeGround定義綁定。這將爲每個生成的TextBlock執行。這裏的挑戰是TextBlock找到數據。這可以通過相對綁定到可視化樹中的祖先DataGridRow來實現。 DataGridRow.Item可以訪問數據網格的背後:

<Window.Resources> 
    <Style x:Key="ForegroundStyle" TargetType="TextBlock"> 
    <Setter Property="Foreground" 
     Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}, 
     Path=Item.Prüfdatum, 
     Converter={StaticResource TimestampToColorConverter}/> 
    </Style> 
</Window.Resources> 

<DataGrid> 
    <DataGrid.Columns> 
    <DataGridTextColumn Binding="{Binding SomeData}" ElementStyle="{StaticResource ForegroundStyle}"/> 
</DataGrid.Columns> 

複雜吧?我建議你閱讀我約的DataGrid詳細的文章在格式化: http://www.codeproject.com/Articles/683429/Guide-to-WPF-DataGrid-formatting-using-bindings?msg=5037235#xx5037235xx

祝你好運,你需要它:-)