1

我为 ListBoxItem 定义了以下样式:

    <Style x:Key="detailListBoxItemStyle" TargetType="{x:Type ListBoxItem}">
    <Setter Property="AutomationProperties.AutomationId" Value="{Binding Path=StringTableKey}"/>
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="HorizontalContentAlignment" Value="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
    <Setter Property="VerticalContentAlignment" Value="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
    <Setter Property="Padding" Value="2,0,0,0"/>
    <Setter Property="FocusVisualStyle" Value="{x:Null}" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListBoxItem}">
                <Border x:Name="Bd" Margin="4" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
                    <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsSelected" Value="true">
                        <Setter Property="Background" TargetName="Bd" Value="{DynamicResource MenuItemSelectedBackgroundBrush}"/>
                        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
                    </Trigger>
                    <Trigger Property="IsSelected" Value="false">
                        <Setter Property="Background" TargetName="Bd" Value="{DynamicResource MenuItemUnSelectedBackgroundBrush}"/>
                    </Trigger>
                    <!-- This is the case when a detail is selected (the master list loses focus). -->
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsSelected" Value="true"/>
                            <Condition Property="Selector.IsSelectionActive" Value="false"/>
                        </MultiTrigger.Conditions>
                        <!--<Setter Property="Opacity" TargetName="Bd" Value=".4"/>-->
                    </MultiTrigger>
                    <Trigger Property="IsEnabled" Value="false">
                        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

应用此样式的 ListBox 定义为:

<ListBox 
    x:Name="listBox"
    Margin="0,60,0,0"
    MaxHeight="600"
    Foreground="Transparent"
    Style="{StaticResource detailListBoxStyle}" 
    ItemContainerStyle="{StaticResource detailListBoxItemStyle}" 
    ItemsSource="{Binding Source={StaticResource detailCollectionViewSource}}" 
    ItemTemplateSelector="{StaticResource detailDataTemplateSelector}"
    TouchDown="ListBoxTouchDown"
    TouchMove="ListBoxTouchMove"
    TouchUp="ListBoxTouchUp"
    KeyDown="ListBoxKeyDown">
    <ListBox.GroupStyle>
        <GroupStyle>
            <GroupStyle.HeaderTemplate>
                <DataTemplate>
                    <TextBlock Margin="0,10,0,0" FontWeight="Bold" FontSize="20" Foreground="White" Text="{Binding Path=Name}"/>
                </DataTemplate>
            </GroupStyle.HeaderTemplate>
        </GroupStyle>
    </ListBox.GroupStyle>
</ListBox>

我有一个 ListBoxItem 的 DataTemplate,它可以是:

<DataTemplate x:Key="detailOnOffTemplate">
    <Grid Height="50" Width="{StaticResource detailWidth}">
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <TextBlock x:Name="tb1" Margin="4,2,0,0" Grid.Row="0" Style="{StaticResource MenuTextStyle}" Text="{Binding DisplayName}" VerticalAlignment="Top" TextAlignment="Left">
         <TextBlock.Effect>
            <DropShadowEffect Color="White" ShadowDepth="0" BlurRadius="7"/>
        </TextBlock.Effect>
        </TextBlock>
    </Grid>
    <DataTemplate.Triggers>
        <DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}, Mode=FindAncestor}}" Value="True">
            <Setter TargetName="tb1" Property="Foreground" Value="White"/>
            <Setter TargetName="tb1" Property="Effect" Value="{x:Null}"/>
        </DataTrigger>
    </DataTemplate.Triggers>
</DataTemplate>

我需要能够从我的 DataTemplate 中绑定到“Selector.IsSelectionActive”,但没有任何效果。我试过这些东西:

            <DataTrigger Binding="{Binding Selector.IsSelectionActive, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}, Mode=FindAncestor}}" Value="True">

            <Trigger Binding="{Binding Selector.IsSelectionActive, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}, Mode=FindAncestor}}" Value="True">

            <Trigger "Selector.IsSelectionActive" Value="True">

基本上,我想要 DataTemplate 的 ControlTemplate 中包含的相同触发器:

                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsSelected" Value="true"/>
                            <Condition Property="Selector.IsSelectionActive" Value="false"/>
                        </MultiTrigger.Conditions>
                        <!--<Setter Property="Opacity" TargetName="Bd" Value=".4"/>-->
                    </MultiTrigger>

或者,我怎么能知道“IsSelected”但没有键盘焦点?

4

2 回答 2

7

您尝试的第一个选项是正确的异常,您没有确定这是一个附加属性,因此看起来您正在尝试绑定到一个名为 Selector 的属性,该属性返回一个具有属性名称 IsSelectionActive 的对象。所以我认为类似以下的方法会起作用:

<DataTrigger Binding="{Binding Path=(Selector.IsSelectionActive), RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}" Value="True">
于 2012-09-26T21:34:31.433 回答
0

以前的答案对我不起作用,但经过几个小时的播放后:

这里的关键(我认为)是 IsSelectionActive FALSE 首先出现。该触发器也是与 IsSelected 结合的多重触发器。在这种情况下,我不必使用括号。但这可能是因为我使用的是最新的 .net 框架、Wpf 和 Visual Studio,所以您可能需要上一个答案中提到的括号。

红色,黄色和白色仅用于此示例,请记住更改这些颜色。

<ControlTemplate.Triggers>
    <MultiTrigger>
        <!-- selected, but not focused -->
        <MultiTrigger.Conditions>
            <Condition Property="Selector.IsSelectionActive" Value="False" />
            <Condition Property="IsSelected" Value="True" />
        </MultiTrigger.Conditions>
        <Setter Property="Background" TargetName="Bd" Value="Yellow" />
    </MultiTrigger>
    <MultiTrigger>
        <!-- selected, and focused -->
        <MultiTrigger.Conditions>
            <Condition Property="Selector.IsSelectionActive" Value="True" />
            <Condition Property="IsSelected" Value="True" />
        </MultiTrigger.Conditions>
        <Setter Property="Background" TargetName="Bd" Value="Red" />
        <Setter Property="Foreground" Value="White" />
    </MultiTrigger>                    
</ControlTemplate.Triggers>
于 2017-06-09T18:56:20.983 回答