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

时间:2012-02-17 07:31:53

标签: c# wpf listview

我有一个对象列表和一个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项......

任何人都可以告诉我如何解决这个问题吗?

2 个答案:

答案 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:代码是手写的