仅在一列中更改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项。。。
有人能告诉我如何解决这个问题吗?
您可以使用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:代码是手写的