Как изменить цвет текста WPF ListView на значение перечисления - PullRequest
1 голос
/ 30 июня 2019

Проблема

Я новичок в WPF и пытаюсь учиться.У меня есть базовый ListView, показывающий информацию о людях, таких как имя, возраст и класс.

Я хочу, чтобы текст результата оценки был зеленым, если enum равен "Pass", и красным, если "Fail", в противном случае цвет текста не изменился.

Что я пробовал

Я знаю, что вы можете жестко закодировать весь текст в столбце, чтобы он был зеленым, красным и т. Д. С помощью Foreground = "", но это не сработает.Я попытался реализовать функцию, которая проверяет, равняется ли каждое перечисление в списке Pass и т. Д., Но я не смог получить его, и я застрял здесь.

XAML

<Grid Margin="10">
        <ListView Name="lvUsers">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Name" Width="120" DisplayMemberBinding="{Binding Name}" />
                    <GridViewColumn Header="Age" Width="50" DisplayMemberBinding="{Binding Age}" />
                    <GridViewColumn Header="Grade" Width="100" DisplayMemberBinding="{Binding Grade}"/>
                </GridView>
            </ListView.View>
        </ListView>
    </Grid>

CS

public partial class MainWindow : Window
    {
        public class User
        {
            public string Name { get; set; }
            public int Age { get; set; }
            public Grade Grade { get; set; }
        }

        public MainWindow()
        {
            InitializeComponent();
            List<User> items = new List<User>();
            items.Add(new User() { Name = "John Doe", Age = 42, Grade = Grade.fail });
            items.Add(new User() { Name = "Jane Doe", Age = 39, Grade = Grade.pass });
            items.Add(new User() { Name = "Sammy Doe", Age = 13, Grade = Grade.fail });
            lvUsers.ItemsSource = items;
        }

        public enum Grade
        {
            none = 0,
            pass = 1,
            fail = 2
        };
    }

Ожидаемый результат

Я не хочу, чтобы весь текст в столбце оценок был зеленым/ красный.И я не хочу добавлять свойство Color внутри класса пользователя.

Когда для пользователя значение enum равно «Pass», текст «Pass» в столбце Grade будет зеленым.Когда это «Fail», текст будет красным.В противном случае цвет текста не изменится.

Любая помощь очень ценится, потому что я застрял здесь.

1 Ответ

3 голосов
/ 01 июля 2019

У вас действительно есть множество вариантов для использования здесь:

Сначала вам нужно заменить эту запись GridViewColumn примерами в одном из следующих разделов:

<GridViewColumn Header="Grade" Width="100" DisplayMemberBinding="{Binding Grade}"/>

1 - DataTrigger

Документация MSDN здесь

Это будет работать, но не может использоваться повторно.

<!-- A custom cell template lets you customise how the cell will display -->
<GridViewColumn Header="Grade" Width="10">
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Name="GradeText" Text="{Binding Grade}" />
            <!-- define rules on how the ui will change based on the data bound -->
            <DataTemplate.Triggers>
                <!-- see NOTE below for how to get this working -->
                <DataTrigger Binding="{Binding Grade}" Value="{x:Static enum:Grade.pass}">
                    <Setter TargetName="GradeText" Property="Foreground" Value="Green"/>
                </DataTrigger>
                <!-- you can add a second one for fail ;) -->
            </DataTemplate.Triggers>
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

ПРИМЕЧАНИЕ: вы будететакже необходимо добавить объявление пространства имен, в которое объявляется ваше перечисление ( полный кредит к этому ответу ):

xmlns: enum = "clr-namespace: YourEnumNamespace; assembly = YourAssembly"

2 - Конвертер

Документация MSDN здесь

Это обеспечивает наименьшее количество XAML, позволяет повторно использовать логику в другом месте иесли вы действительно заботитесь об этом, протестируйте логику преобразователя.

<!-- A custom cell template lets you customise how the cell will display -->
<GridViewColumn Header="Grade" Width="10">
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Name="GradeText" Text="{Binding Grade}" Foreground="{Binding Grade, Converter={StaticResource GradeToBrushConverter}}"/>
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

и код преобразователя:

public GradeToBrushConverter : IValueConverter
{
    public object Convert (object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is Grade grade)
        {
            switch (grade)
            {
                case Grade.pass:
                    return Brushes.Green;
                case fail:
                    return Brushes.Red;
                default:
                    return Brushes.Black; // Or a more sensible default.
            }
        }

        return Brushes.Black;
    }

    // I haven't provided the ConvertBack but you should be able to work this bit out.
}

3 - Styling

Да, я ценю, что этот пример выглядит очень похоже на пункт 1, но он имеет дополнительное преимущество, что если вы объявитеСтиль может быть использован в нескольких местах.

<!-- A custom cell template lets you customise how the cell will display -->
<GridViewColumn Header="Grade" Width="10">
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Name="GradeText" Text="{Binding Grade}">
                <TextBlock.Style>
                    <Style TargetType="TextBlock">
                        <Setter Property="Foreground" Value="Black"/>
                        <Style.Triggers>
                            <!-- see NOTE below for how to get this working -->
                            <DataTrigger Binding="{Binding Grade}" Value="{x:Static enum:Grade.pass}">
                                <Setter Property="Foreground" Value="Green"/>
                            </DataTrigger>
                            <!-- you can add a second one for fail ;) -->
                        </Style.Triggers>
                    </Style>
                </TextBlock.Style>
            </TextBlock>
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...