Установка цвета GridView в WPF с помощью кода - PullRequest
1 голос
/ 30 марта 2011

Я довольно долго искал, как это сделать.Я не знаю, как установить цвет элемента строки в GridView (WPF), используя код Я не хочу, чтобы пример в XAML

Мои данные получены от меня, загружая иразбирает XML-файл.Затем я помещаю его в небольшой класс со свойствами, которые привязаны к столбцу для заполнения данными.Позже, это может начать некоторые функции на данных таблицы.Поскольку это занимает иногда более 10 минут, это происходит в потоке, и я хотел бы раскрасить строки, которые я выполнил, в зависимости от результата.(IE: красный для ошибки HTTP, оранжевый для ошибки синтаксического анализа XML и т. Д.) *

Это XAML GridView:

<ListView Name="RepoListView" Margin="0,22,0,0">
  <ListView.View>
    <GridView AllowsColumnReorder="True">
      <GridViewColumn Header="Title" DisplayMemberBinding="{Binding title}" />
      <GridViewColumn Header="URL" DisplayMemberBinding="{Binding url}" />
      <GridViewColumn Header="Subscriptions" DisplayMemberBinding="{Binding dlc}" />
    </GridView>
  </ListView.View>
</ListView>

Затем я анализирую данные, используя столбец url.В настоящее время я изменяю выбранный элемент по мере прохождения.Я хочу знать, могу ли я что-то сделать, чтобы изменить конкретный предмет.Давайте предположим, что я нахожусь в строке 500:

Я использую: setSelected (i), которая использует Dispatcher для безопасного изменения выбранной строки.Что я могу сделать, чтобы изменить цвет?Я часами пытался найти решение.

Спасибо

1 Ответ

3 голосов
/ 30 марта 2011

Я бы, наверное, выбрал обязательный подход, код позади уродлив.Создайте свойство с перечислением ошибок и создайте DataTemplate или стиль, в котором вы привязываете фон к указанному свойству.

Редактировать: Пример ...

В вашем классе:

public enum ParsingStatus { None, Completed, XmlError, HtmlError }

private ParsingStatus _status = ParsingStatus.None;
public ParsingStatus Status
{
    get { return _status; }
    set
    {
        if (_status != value)
        {
            _status = value;
            NotifyPropertyChanged("Status");
        }
    }
}

Затем вы можете связать свойство background с помощью конвертера, например:

public class ErrorToBrushConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        Employee.ParsingStatus input = (Employee.ParsingStatus)value;
        switch (input)
        {
            case Employee.ParsingStatus.None:
                return null;
            case Employee.ParsingStatus.Completed:
                return Brushes.LightGreen;
            case Employee.ParsingStatus.XmlError:
                return Brushes.Pink;
            case Employee.ParsingStatus.HtmlError:
                return Brushes.Yellow;
            default:
                return null;
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

И соответствующий XAML:

<Window.Resources>
    <local:ErrorToBrushConverter x:Key="ErrorToBrushConv"/>
    ...
</Window.Resources>
    ...
        <ListView ItemsSource="{Binding Data}">
            <ListView.ItemContainerStyle>
                <Style TargetType="{x:Type ListViewItem}">
                    <Setter Property="Background"
                            Value="{Binding Status, Converter={StaticResource ErrorToBrushConv}}"/>
                </Style>
            </ListView.ItemContainerStyle>
            ...
        </ListView>

Или выУкажите только стиль и выполните переключение состояния с помощью триггеров:

<ListView.ItemContainerStyle>
    <Style TargetType="{x:Type ListViewItem}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Status}" Value="XmlError">
                <Setter Property="Background" Value="Pink"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding Status}" Value="HtmlError">
                <Setter Property="Background" Value="#FFFFFF66"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding Status}" Value="Completed">
                <Setter Property="Background" Value="LightGreen"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</ListView.ItemContainerStyle>

( Роберт Россни предложил использовать триггеры, так как вы можете видеть, что он довольно короткий и не требует кода вообщеЯ не могу думать о каких-либо недостатках в этом, и я понятия не имею, почему я не сделал это, как это в первую очередь ... )

Что выглядит так с конвертером (желтыйтриггер-метод больше подходит):A colourful ListView

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...