Используйте ValueConverter. Хотя я точно не знаю, что вы имеете в виду под «75% времени прошло с момента создания задачи», я предполагаю, что вы имеете в виду, когда приближается крайний срок.
Пример:
public class DueTimeColorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var dueTime = (DateTime)value;
if (dueTime.Date >= DateTime.Now)
return new SolidColorBrush(Colors.Red);
else if (TimeSpan.FromTicks(DateTime.Now.Ticks - dueTime.Date.Ticks).TotalDays <= 2)
return new SolidColorBrush(Colors.Orange);
return new SolidColorBrush(Colors.Green);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
Затем используйте его в своем XAML, применив преобразователь значений к привязке цвета границы на основе срока выполнения задачи:
<ListBox ItemsSource="{Binding Items}" HorizontalContentAlignment="Stretch">
<ListBox.Resources>
<local:DueTimeColorConverter x:Key="colorConverter"/>
</ListBox.Resources>
<ListBox.ItemTemplate>
<DataTemplate>
<Border BorderThickness="1">
<TextBlock Text="{Binding Name}" Margin="5"/>
<Border.Style>
<Style TargetType="Border">
<Setter Property="BorderBrush" Value="{Binding DueTime, Converter={StaticResource colorConverter}}"/>
</Style>
</Border.Style>
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Мой упрощенный класс «Item» и его ObservableCollection:
this.Items.Add(new Item() { Name = "Item 1", DueTime = DateTime.Today.AddDays(-7) });
this.Items.Add(new Item() { Name = "Item 2", DueTime = DateTime.Today.AddDays(-6) });
this.Items.Add(new Item() { Name = "Item 3", DueTime = DateTime.Today.AddDays(-5) });
this.Items.Add(new Item() { Name = "Item 4", DueTime = DateTime.Today.AddDays(-4) });
this.Items.Add(new Item() { Name = "Item 5", DueTime = DateTime.Today.AddDays(-3) });
this.Items.Add(new Item() { Name = "Item 6", DueTime = DateTime.Today.AddDays(-2) });
this.Items.Add(new Item() { Name = "Item 7", DueTime = DateTime.Today.AddDays(-1) });
this.Items.Add(new Item() { Name = "Item 8", DueTime = DateTime.Today });
this.Items.Add(new Item() { Name = "Item 9", DueTime = DateTime.Today.AddDays(1) });
this.Items.Add(new Item() { Name = "Item 10", DueTime = DateTime.Today.AddDays(2) });
this.Items.Add(new Item() { Name = "Item 11", DueTime = DateTime.Today.AddDays(3) });
Пример вывода: