c# - 绑定(bind) WPF DataGrid 文本列的前景

标签 c# wpf datagrid binding converter

我尝试构建一个 DataGrid,我想将 TextColums 的 Foreground 属性之一绑定(bind)到一个日期,以便它在日期为过去时变为红色。

这里是 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
}

我不知道哪里出了问题,但 Converter 甚至没有被调用(第一个 Converter 工作得很好)。输出窗口显示如下:

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

我希望你能帮助我,伙计们

谢谢

最佳答案

DataGridTextColumn 告诉 DataGrid 为该列中的每一行创建一个 TextBlock。 DataGridTextColumn.Binding 然后为 TextBlock.Text 设置绑定(bind),每次创建新行和为该行创建新的 TextBlock 时都会触发该绑定(bind)。

我不知道绑定(bind)是否曾经执行过,但最多执行一次(即不是每一行):

Binding="{Binding Path=Prüfdatum, Converter={StaticResource TimestampToDateConverter}}"

正确的解决方案是为该文本 block 创建样式并为前景定义绑定(bind)。这将为生成的每个 TextBlock 执行。这里的挑战是让 TextBlock 找到数据。这可以通过相对绑定(bind)到可视化树中的祖先 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>

复杂吧?我建议您阅读我关于数据网格格式的详细文章: http://www.codeproject.com/Articles/683429/Guide-to-WPF-DataGrid-formatting-using-bindings?msg=5037235#xx5037235xx

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

关于c# - 绑定(bind) WPF DataGrid 文本列的前景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3118485/

相关文章:

c# - 如何在 Ninject 中使用策略模式

wpf - 如何获取 WPF 窗口控件集合

c# - 数据未显示在 View 上

c# - MultiBinding 转换器未绑定(bind)到 DataTemplate 中的 TextBlock

c# - LINQ:没有使用点表示法的 long final 匿名变量的多个 JOINS

c# - Asp.net Response.Redirect - 不正确的推荐人

c# - 如何将工具提示添加到数据网格单元格

c# - WPF 数据网格 : IsVirtualizingWhenGrouping ="True" not working

c# - 当有多个连接可用时,无法处理连接问题(数据库或外部系统)

c# - 验证 MVVM WPF