绑定WPF DataGrid文本列的前景

时间:2010-06-25 13:43:59

标签: c# wpf datagrid binding converter

我尝试构建一个DataGrid,我想将其中一个TextColums的Foreground属性绑定到Date,如果Date是过去的话,它会变为红色。

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

我不知道出了什么问题,但转换器甚至没有出现问题(第一个转换器工作正常)。输出窗口显示:

  

System.Windows.Data错误:2:找不到管理FrameworkElement   或FrameworkContentElement   目标要素。   BindingExpression:路径=Prüfdatum;   的DataItem = NULL;目标元素是
  'DataGridTextColumn'   (的HashCode = 16187528);目标财产   是'前景'(类型'刷')

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

THX

3 个答案:

答案 0 :(得分:4)

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

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

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

正确的解决方案是为该文本块创建样式并为ForeGround定义绑定。这将针对生成的每个TextBlock执行。这里的挑战是TextBlock查找数据。这可以通过对DataGridRow的相对绑定来实现,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

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

答案 1 :(得分:0)

由于您已绑定到DataGrid,因此不需要DataGridTextColumn中的“绑定”,也不需要ConverterParameter,因为您的转换器未使用该参数。请尝试以下

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

答案 2 :(得分:0)

DataGridTextColumn Foreground属性数据绑定不起作用。

Peter Huber的回答是一个很好的解决方案。这是一个稍微简单的替代方案。

const BreakupForm = (props) => {

  const onBasicFieldChange = (event, newValue, previousValue, name) => {
    console.log(newValue)
  }

  console.log(props);
  const { handleSubmit, pristine, reset, submitting } = props
  return (
    <div>
      <Label >Breakup</Label>
      <form onSubmit={handleSubmit}>
        <Field onChange={onBasicFieldChange} label="Basic" name="basic" component={renderField} type="text" placeholder="basic" />
        <Field label="HRA" name="hra" component={renderField} type="text" placeholder="HRA" />
        <Field label="Transport Allowance" name="ta" component={renderField} type="text" placeholder="Transport Allowance" />
        <Field label="Special Allowance" name="specialAllowance" component={renderField} type="text" placeholder="Special Allowance" />
        <Field label="LTA" name="lta" component={renderField} type="text" placeholder="LTA" />
        <Field label="Medical Bills" name="medicalBills" component={renderField} type="text" placeholder="Medical Bills" />
      </form>
    </div>

  )
}