Установить цвет границы в списке с привязкой - PullRequest
0 голосов
/ 17 июня 2020

У меня есть проект, в главном окне которого у меня есть список столбцов, а внутри него - список задач для каждого столбца. Мне нужно изменить цвет границы каждой задачи при определенных условиях: например, если прошло 75% времени с момента создания задачи, она будет окрашена в оранжевый цвет, красный - в случае просрочки и так далее. как я могу изменить конкретную задачу c в моем списке с привязкой? Я не понимаю, как получить детали задачи, потому что это должно происходить мгновенно, а не только если задача выбрана. есть идеи?

1 Ответ

0 голосов
/ 17 июня 2020

Используйте 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) });

Пример вывода:

enter image description here

...