1

我正在创建一个绑定到数据库的故障日志应用程序

如果列出的 DateTime 比当前日期早 3 周,我想要的主要用途是将 DateTime 单元格格式化为 RED。

主窗口.xaml

<DataGrid AutoGenerateColumns="False" Height="379" HorizontalAlignment="Left" Margin="0,36,0,0" Name="dataGridLog" VerticalAlignment="Top" Width="432" SelectionChanged="dataGridLog_SelectionChanged" IsReadOnly="True" MouseDoubleClick="dataGridLog_MouseDoubleClick" ItemsSource="{Binding}" RowDetailsVisibilityMode="VisibleWhenSelected">

    <DataGrid.Columns>
        <DataGridTemplateColumn x:Name="dateColumn" Header="Date" Width="80" CanUserReorder="True" CanUserSort="False">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock x:Name="dateColumnTextBlock" Text="{Binding Path=DateSent, StringFormat={}{0:dd/MM/yyyy}}" Width="80" />
                    <DataTemplate.Triggers>
                        <!--<DataTrigger Binding="{Binding Path=DateSent, StringFormat={}{0:dd/MM/yyyy}, Converter={x:Reference mIsEqualOrGreaterThanConverter.Instance}, ConverterParameter=3}" Value="True">
                            <Setter TargetName="dateColumnTextBlock" Property="Background" Value="Red" />
                        </DataTrigger>-->
                    </DataTemplate.Triggers>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>

        <DataGridTemplateColumn x:Name="priorityColumn" Header="Priority" Width="80" CanUserReorder="True" CanUserSort="True">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock x:Name="priorityColumnTextBlock" Text="{Binding Path=Priority}" Width="80" />
                    <!--<DataTemplate.Triggers>
                        <DataTrigger Binding="{Binding Path=Priority}" Value="Urgent">
                            <Setter TargetName="priorityColumnTextBlock" Property="Background" Value="Red" />
                        </DataTrigger>
                    </DataTemplate.Triggers>-->
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>

        <DataGridTextColumn x:Name="titleColumn" Binding="{Binding Path=Fault}" Header="Title" Width="270" CanUserReorder="True" CanUserSort="True" />
   </DataGrid.Columns>
</DataGrid>

主窗口.xaml.cs

[ValueConversion(typeof(DateTime), typeof(String))]
public class DateConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        DateTime date = (DateTime)value;
        DateTime curDate = DateTime.Now;

        TimeSpan span = curDate.Subtract(date);

        return span.Days;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string strValue = value as string;
        DateTime resultDateTime;
        if (DateTime.TryParse(strValue, out resultDateTime))
        {
            return resultDateTime;
        }
        return DependencyProperty.UnsetValue;
    }
}

我似乎无法绑定转换器,无法转换日期。

4

1 回答 1

4

如果您已声明您ConverterResources

<Window.Resources>
    <local:IsEqualOrGreaterThanConverter x:Key="IsEqualOrGreaterThanConverter" />
</Window.Resources>

你可以像这样引用它

<DataTrigger Binding="{Binding Path=DateSent, Converter={StaticResource IsEqualOrGreaterThanConverter}, ConverterParameter=3}" Value="True">
    <Setter TargetName="dateColumnTextBlock" Property="Background" Value="Red" />
</DataTrigger>

DataTrigger与 True 进行比较。因此,您Converter应该返回一个布尔值。

[ValueConversion(typeof(DateTime), typeof(bool))]
public class IsEqualOrGreaterThanConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        DateTime date = (DateTime)value;
        DateTime curDate = DateTime.Now;

        TimeSpan span = curDate.Subtract(date);

        return span.TotalDays > (int)parameter * 7;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
于 2012-08-14T12:36:47.580 回答