WPF ListView:当Focusable设置为false时,设置特定项目的背景颜色

时间:2016-01-19 15:14:12

标签: c# wpf xaml

基本上,我有一个有两个条件的ListView:

  • 不要让用户选择任何项目(出于可用性原因)
  • 如果行符合特定条件,则显示具有特殊背景颜色的行

做任何一点都很容易,但我不能同时做到这两点。一个让解释更容易的例子:

<ListView ItemsSource="{Binding Items}">
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="Focusable" Value="false"/>
        </Style>
    </ListView.ItemContainerStyle>
    <ListView.Resources>
        <Style TargetType="{x:Type ListViewItem}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsOnline}" Value="false">
                    <Setter Property="Background" Value="LightGray" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ListView.Resources>
    [... the rest ...]
</ListView>

如果我删除了ListView.ItemContainerStyle部分,则会正确绘制背景颜色。但是当Focusable设置为false时,将Background设置为LightGray无效。

有没有办法同时做两件事?

2 个答案:

答案 0 :(得分:1)

使用当前代码,您可以有效地将样式设置两次,因此将忽略第二个样式声明。摆脱ItemContainerStyle并将Focusable属性移动到第二种样式,如下所示:

<ListView ItemsSource="{Binding Items}">
<ListView.Resources>
    <Style TargetType="{x:Type ListViewItem}">
    <Setter Property="Focusable" Value="false"/>
        <Style.Triggers>
            <DataTrigger Binding="{Binding IsOnline}" Value="false">
                <Setter Property="Background" Value="LightGray" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</ListView.Resources>
[... the rest ...]
</ListView>

答案 1 :(得分:0)

似乎你还需要一个触发器才能解决&#34;如果选择&#34;出现。这样的事情:

<Style.Triggers>
    <DataTrigger Binding="{Binding Path=IsSelected, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListViewItem}}}" Value="True">
        <Setter Property="Background" Value="place a color you want">
    </DataTrigger>
</Style.Triggers>

此外,您可能会发现此讨论也很有用:Change selection-color of WPF ListViewItem