仅在一列中更改ListView项的前景色

本文关键字:ListView 前景色 一列 | 更新日期: 2023-09-27 18:24:51

我有一个对象列表和一个ListView,我在其中显示这个列表。这样的对象有一些属性,它们被绑定到ListView的列。

<ListView x:Name="_fileNameList" FontSize="12" SourceUpdated="_fileNameList_SourceUpdated" TargetUpdated="_fileNameList_TargetUpdated">
    <ListView.View>
        <GridView x:Name="FileNameAttributes" >
            <GridViewColumn  Header="File Name"   Width="200" DisplayMemberBinding="{Binding fileName}"/>
            <GridViewColumn  Header="Size" Width="80" DisplayMemberBinding="{Binding size}"/>
            <GridViewColumn  Header="Date" Width="80" DisplayMemberBinding="{Binding date}"/>
            <GridViewColumn  Header="Time" Width="80" DisplayMemberBinding="{Binding time}"/>
            <GridViewColumn  Header="New Name" Width="300" DisplayMemberBinding="{Binding newFileName}"/>
        </GridView>
    </ListView.View>
</ListView>

这部分工作正常。

现在,我想更改单行中newFileName列的前景颜色,但前提是它等于同一行中的"fileName"。

我可以在XAML中执行此操作吗?还是必须转到代码隐藏文件?

我最希望我能在XAML中处理它,因为我认为这是一个纯粹的设计问题,但我不知道从哪里开始或放在哪里,(我可以在XAML中进行字符串比较吗?)

所以我试着在代码隐藏文件中处理这个问题。我认为ListView更改时一定会引发一个事件,我尝试了SourceUpdated事件,但在更改列表内容时没有输入
下一个问题是,如何访问这些ListView项。。。

有人能告诉我如何解决这个问题吗?

仅在一列中更改ListView项的前景色

您可以使用MultiBinding和MultiConverter来完成此操作。您需要编写一个MultiConverter,它接受fileName和newFileName,如果它们相等,则返回true

<ListView x:Name="_fileNameList" FontSize="12" SourceUpdated="_fileNameList_SourceUpdated" TargetUpdated="_fileNameList_TargetUpdated">
            <ListView.View>
                <GridView x:Name="FileNameAttributes" >
                    <GridViewColumn  Header="File Name"   Width="200" DisplayMemberBinding="{Binding fileName}"/>
                    <GridViewColumn  Header="Size" Width="80" DisplayMemberBinding="{Binding size}"/>
                    <GridViewColumn  Header="Date" Width="80" DisplayMemberBinding="{Binding date}"/>
                    <GridViewColumn  Header="Time" Width="80" DisplayMemberBinding="{Binding time}"/>
                    <GridViewColumn  Header="New Name" Width="300">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding newFileName}">
                                    <TextBlock.Style>
                                        <Style>
                                            <Setter Property="TextBlock.Foreground" Value="Black"></Setter>
                                            <Style.Triggers>
                                                 <DataTrigger Value="True">
                                                     <DataTrigger.Binding>
                                                         <MultiBinding Converter="{StaticResource EqualityConverter}">
                                                             <Binding Path="newFileName"></Binding>
                                                             <Binding Path="fileName"></Binding>
                                                         </MultiBinding>
                                                     </DataTrigger.Binding>
                                        <Setter Property="TextBlock.Foreground" Value="Red"></Setter>
                                    </DataTrigger>
                                            </Style.Triggers>
                                        </Style>
                                    </TextBlock.Style>
                                </TextBlock>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>

EqualityConverter的代码如下:

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            if (values[0].ToString().Equals(values[1].ToString()))
                return true;
            return false;
        }

如果您想更改任何wpf元素的样式,您应该使用style。如果你想在某些条件下发生,你应该使用Style.Triggers。如果你的条件属于绑定信息,你应该用DataTrigger。如果XAML数据触发器无法处理您的条件,请添加转换器。

所以我建议你在GridViewColum.Style中使用一个数据触发器和一个有两个参数filename和newfilename的多转换器。如果为false,则返回true。

类似的东西:

<DataTrigger Value="True">
  <DataTrigger.Binding>
    <MultiBinding Converter="{StaticResource MyFileNameCheckConverter}">
        <Binding Path="fileName"/>
        <Binding Path="newFileName"/>
    </MultiBinding>
  </DataTrigger.Binding>
  <Setter Property="Foreground" Value="Red"/>
 </DataTrigger>

转换器

public class FileNameCheckConverter: IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        var filename = (string)values[0];
        var newfilename = (string)values[1];
        return filename==newfilename;
    }
    ...
}

ps:别忘了在你的风格中设置"正常"的前景!否则触发器就不会工作。

pps:代码是手写的