我尝试构建一个 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/