【问题标题】:How to change a color of a single row in the ListView?如何更改 ListView 中单行的颜色?
【发布时间】:2016-04-22 14:35:39
【问题描述】:

我构建了链接到实体框架的 WPF 应用程序。

程序将用户详细信息添加到列表中,所有详细信息都存储在数据库中。因此,每当我关闭并重新打开应用程序时,之前添加的详细信息都会在那里。

该应用程序具有计算平均模块等级的功能。

这是我的代码片段:

if (averageResult < 7 && averageResult > 5)
{
    student.Average_Grade = "F";
}

所以如果满足这个条件,我也希望行变红或者字母F变红。

我搜索了互联网,但我唯一发现的是如何在未链接到数据库的简单 WPF 应用程序中更改它。

如果 WPF 应用程序链接到数据库,如何更改 ListView 中单行的颜色?

更新

我试过这段代码:

 student.Average_Grade = "F" + new SolidColorBrush(Colors.Red);

但不是单行而是改变整个窗口的颜色

LISTVIEW XAML

 <ListView Grid.Row="0" x:Name="studentListView" SelectionMode="Single" Margin="10,10,-10,10" ItemsSource="{Binding}">
            <ListView.View>
                <GridView>

                    <GridViewColumn x:Name="first_NameColumn" Width="80" Header="First Name">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBox Margin="-6,-1" Text="{Binding First_Name, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}" IsReadOnly="True"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn x:Name="last_NameColumn" Width="80" Header="Last Name">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBox Margin="-6,-1" Text="{Binding Last_Name, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}" IsReadOnly="True"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn x:Name="matric_NumberColumn" Width="80" Header="Matric Number">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBox Margin="-6,-1" Text="{Binding Matric_Number, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}" IsReadOnly="True"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>

                    <GridViewColumn x:Name="component1_GradeColumn" Width="80" Header="Component 1 Grade" >
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBox Margin="6,-1,-6,-1" Text="{Binding Component1_Grade, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}" IsReadOnly="True"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn x:Name="component2_GradeColumn" Width="80" Header="Component 2 Grade">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBox Margin="-6,-1" Text="{Binding Component2_Grade, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}" IsReadOnly="True"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn x:Name="component3_GradeColumn" Width="80" Header="Component 3 Grade">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBox Margin="-6,-1" Text="{Binding Component3_Grade, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}" IsReadOnly="True"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn x:Name="average_GradeColumn" Width="80" Header="Average Grade">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBox Margin="-6,-1" Text="{Binding Average_Grade, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}" IsReadOnly="True"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn x:Name="edit">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <Button Content="Edit" Click="OnEdit"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn x:Name="delete">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <Button Content="Delete" Click="OnDelete" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
            <ListView.ItemContainerStyle>
                <Style>
                    <Setter Property="Control.HorizontalContentAlignment" Value="Stretch"/>
                    <Setter Property="Control.VerticalContentAlignment" Value="Stretch"/>
                </Style>
            </ListView.ItemContainerStyle>
        </ListView>

【问题讨论】:

  • 数据库与它无关。 Use an ItemTemplate。如果还没有,您还需要在 Student 类上实现 INotifyPropertyChanged。
  • 所以按照你的逻辑,我还得去学生课,对平均成绩栏做一些修改?一切对我来说都很好,我只是不知道如何改变那个 F 的颜色
  • 你能分享你的 xaml 吗?我认为您需要一个转换器,它将测试是否满足条件并返回红色
  • 如果您希望ListView 在您更改student.Average_Grade 的值时更新任何内容,那么您需要在Average_Grade 更改时通知ListView。 INotifyPropertyChanged 就是你这样做的方式。
  • 哦,等等,Student 类是由实体框架生成的吗?那么你肯定不想改变它。让我快速研究一下。

标签: c# wpf entity-framework listview data-binding


【解决方案1】:

您可以使用转换器。如下添加一个新类:

public class Converter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if(value.ToString() == "F")
            return new SolidColorBrush(Colors.Red);
        else
            return new SolidColorBrush(Colors.Black);
    }

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

然后在您的 xaml 中添加以下内容:

<Window.Resources> // Or UserControl.Resources
    <local:Converter x:Key="converter"/> 
</Window.Resources>

并替换ItemContainerStyle

<ListView.ItemContainerStyle>
    <Style TargetType="ListViewItem">
        <Setter Property="Control.HorizontalContentAlignment" Value="Stretch"/>
        <Setter Property="Control.VerticalContentAlignment" Value="Stretch"/>
        <Setter Property="Foreground" Value="{Binding Average_Grade, Converter={StaticResource converter}}" />
    </Style>
</ListView.ItemContainerStyle>

【讨论】:

  • 你需要哪些进口?
  • 抱歉,没有 Foregroung 这样的词。而且我在输入 消息后收到一条错误消息:“Converter not in the same namespace”即使它是
  • @user3438350 你放了 TargetType="ListViewItem" 吗?转换器必须是公共的,并且本地必须声明如下:xmlns:local="clr-namespace:ApplicationName"
  • 写完风格后,为什么不扔掉转换器(只会让他伤心)并使用触发器?
  • 我明天会检查它,告诉你是否有效
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-27
  • 2012-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多