如何从DataTemplate绑定到Selector.IsSelectionActive?

时间:2012-09-26 18:40:44

标签: wpf

我为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”但没有键盘焦点?

2 个答案:

答案 0 :(得分:6)

您尝试的第一个选项是正确的异常,您没有确定它是附加属性,因此看起来您正在尝试绑定到名为Selector的属性,该属性返回具有属性名称IsSelectionActive的对象。所以我认为以下内容可行:

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

答案 1 :(得分: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>