我有一个对象列表和一个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项......
任何人都可以告诉我如何解决这个问题吗?
答案 0 :(得分:3)
您可以使用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;
}
答案 1 :(得分:2)
如果你想改变任何wpf元素的风格,你应该使用Style。如果你想在某些情况下发生它你应该使用Style.Triggers。如果您的条件属于绑定信息,则应使用DataTrigger。如果XAML数据触发器无法处理您的情况,请添加转换器。
所以我建议你在GridViewColum.Style和一个带有2个参数filename和newfilename的多转换器中取一个数据触发器。如果相同则返回true,否则为false。
类似的东西:
<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:代码是手写的