4

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

1)如果值为某个值,则突出显示 ListView 中一行的单元格 - 我想我可以为此使用 GridViewColumn.CellTemplate 并使用 DataTrigger 创建一个 DataTemplate,但是我在这里变得困惑 - 是 DataType 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>

但是,这并不奇怪会导致错误消息

Cannot find the Template Property 'Background' on the type 'System.Windows.Controls.ContentPresenter'

2)类似于 1)我想在另一个标准上有一个类似的规则我想突出显示整行,而不是仅仅基于类似 DataTrigger 属性的单元格,但同时我希望单元格突出显示优先于行突出显示.

我将如何做到这一点以及我需要覆盖什么模板才能做到这一点?我猜它是 ListView.ItemTemplate 但数据类型是什么?

4

2 回答 2

4

试试这个:

<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>
于 2012-08-19T18:57:37.273 回答
2

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

<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"];
    }
}

然后将不同的样式以及选择器引用一起放入 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类)有效地设置背景颜色,并且突出显示的列仍然有效。

于 2012-08-19T20:29:45.880 回答