C# 在ListView的CellTemplate中创建触发器?(通常与模板混淆)

C# 在ListView的CellTemplate中创建触发器?(通常与模板混淆),c#,.net,wpf,xaml,C#,.net,Wpf,Xaml,当我深入研究WPF时,我开始有点困惑,我觉得这个例子将有助于更好地理解事物。我的要求是:我有一个ListView,它使用一个绑定到一组普通.NET对象,我想做两件事: 1) 如果值是某个值,则在ListView中突出显示行的单元格-我想我可以使用GridViewColumn.CellTemplate来实现此目的,并使用DataTrigger创建DataTemplate,然而,我在这里感到困惑-DataTemplate的数据类型应该是ListViewItem还是应该是底层对象本身的类型 这是我在W

当我深入研究WPF时,我开始有点困惑,我觉得这个例子将有助于更好地理解事物。我的要求是:我有一个ListView,它使用一个绑定到一组普通.NET对象,我想做两件事:

1) 如果值是某个值,则在ListView中突出显示行的单元格-我想我可以使用GridViewColumn.CellTemplate来实现此目的,并使用DataTrigger创建DataTemplate,然而,我在这里感到困惑-DataTemplate的数据类型应该是ListViewItem还是应该是底层对象本身的类型

这是我在WPF中的一个普遍困惑点。不知道何时将其键入基础集合对象(我在示例中看到过)与列表项类型本身。这是我的第一次尝试:

<GridViewColumn Header="Position">
    <GridViewColumn.CellTemplate>
        <DataTemplate DataType="{x:Type ListViewItem}">
            <TextBlock Text="{Binding Path=PositionCode}"></TextBlock>
            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding PositionCode}" Value="QB">
                    <Setter Property="Foreground" Value="Blue" />
                </DataTrigger>
                <DataTrigger Binding="{Binding PositionCode}" Value="RB">
                    <Setter Property="Foreground" Value="Green" />
                </DataTrigger>
                <DataTrigger Binding="{Binding PositionCode}" Value="WR">
                    <Setter Property="Foreground" Value="Red" />
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>
2) 类似于1)我希望在另一个条件上有一个类似的规则我希望高亮显示整行,而不仅仅是基于类似DataTrigger属性的单元格,但同时我希望单元格高亮显示优先于行高亮显示

我该怎么做?我需要覆盖哪个模板才能做到这一点?我猜是ListView.ItemTemplate,但数据类型是什么?

试试这个:

<GridViewColumn Header="Position">
    <GridViewColumn.CellTemplate>
        <DataTemplate DataType="{x:Type ListViewItem}">
            <TextBlock Name="TextBlockName" Text="{Binding Path=PositionCode}"></TextBlock>
            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding PositionCode}" Value="QB">
                    <Setter TargetName="TextBlockName" Property="Foreground" Value="Blue" />
                </DataTrigger>
                <DataTrigger Binding="{Binding PositionCode}" Value="RB">
                    <Setter TargetName="TextBlockName" Property="Foreground" Value="Green" />
                </DataTrigger>
                <DataTrigger Binding="{Binding PositionCode}" Value="WR">
                    <Setter TargetName="TextBlockName" Property="Foreground" Value="Red" />
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

我认为dvvrd的回答解决了您的第一个问题。对于其他部分(构建行样式),可以使用ItemContainerStyleSelector

然后,不同的样式以及选择器引用进入App.xaml:

<Application.Resources>
    <res:RowStyleSelector x:Key="Selector" />
    <Style x:Key="Selected" TargetType="ListViewItem">
        <Setter Property="Background" Value="DarkGray" />
    </Style>
    <Style x:Key="Normal" TargetType="ListViewItem">
        <Setter Property="Background" Value="LightBlue" />
    </Style>
</Application.Resources>


这种方法可以根据模型中的条件(我的示例中的Item类)有效地设置背景色,列高亮显示仍然有效。

好的,谢谢。我还使用一个值转换器解决了这个问题,我想有条件地绑定这些属性,这也很有效-谢谢!我认为对于我来说,更广泛的理解问题是,绑定列表中的每个项都由一个内容控件(例如ListBoxItem、ComboBoxItem等)包装,并且您为列表的ItemTemplate属性指定的任何模板都将用作ContentTemplate(不是ControlTemplate-这总是让我感到困惑,因为单词看起来是一样的)列表中的每个项目本身
<ListView ItemContainerStyleSelector="{StaticResource Selector}" ...
public class RowStyleSelector : StyleSelector
{
    public override System.Windows.Style SelectStyle(object item, System.Windows.DependencyObject container)
    {
        var i = (item as Item);
        if (i.I == 0) return (Style)App.Current.Resources["Selected"];
        else return (Style)App.Current.Resources["Normal"];
    }
}
<Application.Resources>
    <res:RowStyleSelector x:Key="Selector" />
    <Style x:Key="Selected" TargetType="ListViewItem">
        <Setter Property="Background" Value="DarkGray" />
    </Style>
    <Style x:Key="Normal" TargetType="ListViewItem">
        <Setter Property="Background" Value="LightBlue" />
    </Style>
</Application.Resources>