C# 绑定WPF DataGrid文本列的前景

C# 绑定WPF DataGrid文本列的前景,c#,wpf,datagrid,binding,converter,C#,Wpf,Datagrid,Binding,Converter,我尝试构建一个DataGrid,我想将TextColums的一个前台属性绑定到一个日期,这样,如果日期是过去的,它就会变成红色 这里是XAML: <toolkit:DataGridTextColumn Binding="{Binding Path=Prüfdatum, Converter={StaticResource TimestampToDateConverter}}" Header="Prüfdatum" Foreground="{Binding Path=Pr

我尝试构建一个DataGrid,我想将TextColums的一个前台属性绑定到一个日期,这样,如果日期是过去的,它就会变成红色

这里是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
}
类TimestampToColorConverter:IValueConverter
{
#换流器构件的区域划分
公共对象转换(对象值,类型targetType,
对象参数,System.Globalization.CultureInfo(区域性)
{
字符串数据=value.ToString();
int year=系统转换为NT32(基准子串(6,4));
int MOUNT=System.Convert.ToInt32(基准子串(3,2));
int day=System.Convert.ToInt32(基准子串(0,2));
整小时=系统转换为32(基准子串(11,2));
int minute=System.Convert.ToInt32(基准子串(14,2));
int second=System.Convert.ToInt32(基准子串(17,2));
日期时间=新的日期时间(年、月、日、小时、分钟、秒);
if(时间
我不知道出了什么问题,但转换器甚至没有校准(第一个转换器工作正常)。“输出”窗口显示以下内容:

System.Windows.Data错误:2:找不到治理框架元素 或的FrameworkContentElement 目标元素。 BindingExpression:Path=Prüfdatum; DataItem=null;目标元素是
“DataGridTextColumn” (HashCode=16187528);目标属性 是“前景”(类型为“画笔”)

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


Thx

因为您已绑定到DataGrid,所以不需要在DataGridTextColumn和ConverterParameter中进行“绑定”,因为您的转换器未使用该参数。试试下面

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

DataGridTextColumn告诉DataGrid为该列中的每一行创建一个文本块。然后,DataGridTextColumn.Binding为TextBlock.Text设置绑定,每当为该行创建新行和新TextBlock时,就会触发该绑定

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

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

正确的解决方案是为该文本块创建样式,并为前景定义绑定。这将为生成的每个文本块执行。这里的挑战是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>


DataGridTextColumn前景属性数据绑定不起作用

彼得·休伯的答案是一个很好的解决方案。这里有一个稍微简单的选择

<DataGridTemplateColumn Header="Heading">
    <DataGridTemplateColumn.CellTemplate >
        <DataTemplate>
            <TextBlock Text="{Binding SomeData}" 
                Foreground="{Binding SomeData, Converter={StaticResource TimestampToColorConverter}}" />
       </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>


但我也希望“Prüfdatum”作为内容(使用参数我同意,这只是一个测试)您可以在转换器中设置断点并查看是否获得值吗?这就是我发现转换器在运行时未被调用的方式我可以在您绑定此控件或DataGrid的DataContext时使用代码吗?