C# 如果JobTimeStart列距离JobTimeFinish列1小时,则WPF更改DataGrid行背景色

C# 如果JobTimeStart列距离JobTimeFinish列1小时,则WPF更改DataGrid行背景色,c#,wpf,C#,Wpf,在我的数据库中,“JobTimeStart”和“JobTimeFinish”都存储为“时间”数据类型。如果“JobTimeStart”距离“JobTimeFinish”1小时,我需要在数据网格中将行背景颜色更改为红色 我为我的“JobDate”列做了一个触发器,这样如果它与今天的日期匹配,它的颜色就会变为橙色。我一直在试着看看是否可以用同样的方法使用触发器,但是没有找到任何与我想要的类似的东西 <DataGrid.RowStyle> <Style TargetType="{x:

在我的数据库中,“JobTimeStart”“JobTimeFinish”都存储为“时间”数据类型。如果“JobTimeStart”距离“JobTimeFinish”1小时,我需要在数据网格中将行背景颜色更改为红色

我为我的“JobDate”列做了一个触发器,这样如果它与今天的日期匹配,它的颜色就会变为橙色。我一直在试着看看是否可以用同样的方法使用触发器,但是没有找到任何与我想要的类似的东西

<DataGrid.RowStyle>
<Style TargetType="{x:Type DataGridRow}">
    <Setter Property="Height" Value="40"></Setter>
    <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
        <Style.Triggers>
            <DataTrigger Binding="{Binding JobDate.Date}" Value="{x:Static System:DateTime.Today}">
                <Setter Property="Background" Value="#ff8d00"/>
            </DataTrigger>
        </Style.Triggers>
</Style>
</DataGrid.RowStyle>



如果这些属性永远不会更改,您可以将触发器绑定到数据项本身,而不是DateProperty,然后使用转换器检查这些属性是否与谓词匹配。但是,如果这些在运行时更改,则不会通知数据触发器:

 <Style.Triggers>
        <DataTrigger Binding="{Binding, Converter={StatocResource SomeConverter}}" Value="true">
            <Setter Property="Background" Value="#ff8d00"/>
        </DataTrigger>
    </Style.Triggers>


如果不需要使用触发器,我会使用该功能。

无法减去时间并将结果与XAML中预定义的
TimeSpan
进行比较

您应该向视图模型或模型添加一个属性,该属性返回一个值,该值指示是否应在视图中设置
Background
属性:

public bool Warn => JobTimeFinish.Subtract(JobTimeStart).TotalHours >= 1;
然后可以在此属性上触发:

 <DataTrigger Binding="{Binding Warn}" Value="True">
     <Setter Property="Background" Value="Red"/>
 </DataTrigger>

通过这种方式,您还可以将逻辑保存在视图模型或它所属的模型中,并且可以单独进行测试。XAML是一种标记语言

 <DataTrigger Binding="{Binding Warn}" Value="True">
     <Setter Property="Background" Value="Red"/>
 </DataTrigger>