2012-08-14 75 views
0

我创建的故障日志应用,绑定到数据库DataTrigger Comapring日期值设置单元格样式

的我想要的东西的主要用途是将日期时间单元格的格式,以RED如果列出的日期时间 是大于目前日期前的3周。

MainWindow.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> 

MainWindow.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; 
    } 
} 

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

+0

如果DateSent是DateTime,则不能转换为int。 – LPL 2012-08-14 08:00:58

+0

谢谢,LPL。 现在铸造为DateTime – TheGeekZn 2012-08-14 08:06:43

+0

但现在你的ConverterParameter是错误的。 3是一个int。什么含有参数,年,日,小时?你想实现什么? – LPL 2012-08-14 09:37:53

回答

2

如果声明了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与真实相比较。因此你的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(); 
    } 
} 
+0

谢谢!这是我需要的确切解决方案:D ..我也注意到我需要在''中进一步添加'xmlns:local =“clr-namespace:FautLog”''。最后,'span.TotalDays>(int)参数* 7;'抛出'Invalid Cast'异常 – TheGeekZn 2012-08-15 06:29:50

+1

必须将参数强制转换为int32,'int param = Int32.Parse(parameter.ToString()); ,然后'返回span.TotalDays>参数* 7;',它的工作:D – TheGeekZn 2012-08-15 06:42:14

+0

你是对的,当然参数是一个字符串,你必须解析它。感谢您的更正。 – LPL 2012-08-15 07:49:53