gpt4 book ai didi

c# - 如何更改枚举值的 WPF ListView 文本颜色

转载 作者:太空宇宙 更新时间:2023-11-03 22:32:24 24 4
gpt4 key购买 nike

问题

我是 WPF 的新手,正在尝试学习。我有一个基本的 ListView,显示有关姓名、年龄和等级等人的信息。

如果枚举为“通过”,我希望评分结果文本为绿色;如果枚举为“失败”,则评分结果文本为红色,否则文本颜色不变。

我尝试过的

我知道您可以使用 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 属性。

当用户的枚举值为“通过”时,“成绩”列中的“通过”文本将为绿色。当它是“失败”时,文本将是红色的。否则,文本颜色不会改变。

非常感谢任何帮助,因为我被困在这里。

最佳答案

实际上,您可以在此处使用多种选项:

首先,您需要将此 GridViewColumn 条目替换为以下部分之一中的示例:

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

1 - 数据触发器

MSDN documentation here

这可以工作,但不可重复使用。

<!-- 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>

请注意,您还需要在声明枚举的位置添加命名空间声明 (full credit to this answer):

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

2 - 转换器

MSDN documentation here

这提供了最少数量的 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 - 样式

是的,我很欣赏这个示例看起来与第 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>

关于c# - 如何更改枚举值的 WPF ListView 文本颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56827933/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com