2017-02-18 71 views
0

我想基于IsDropDownOpen显示不同的组合框图像。不知道如何正确访问'imgArrow'。DataTemplate的XAML ControlTemplate触发器失败

<Style TargetType="ComboBox"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="ComboBox" > 
       <Grid Background="{DynamicResource ComboDropdownNormal}" Height="50" Width="326" > 
        <ContentPresenter Content="{TemplateBinding SelectionBoxItem}" > 
         <ContentPresenter.ContentTemplate> 
          <DataTemplate> 
           <Grid> 
            <TextBlock Text="{Binding}" /> 

            <Image x:Name="imgArrow" 
              Source="{DynamicResource ComboBoxArrowNormalImage}" 
              RenderOptions.BitmapScalingMode="HighQuality" /> 
           </Grid> 
          </DataTemplate> 

         </ContentPresenter.ContentTemplate> 
        </ContentPresenter> 

        <ToggleButton ClickMode="Press" Focusable="false" 
            IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" 
            Template="{StaticResource ComboBoxToggleButtonTmp}" /> 

        <Popup IsOpen="{TemplateBinding IsDropDownOpen}" Placement="Bottom" > 
         <ContentControl> 
          <Border x:Name="DropDownBorder" 
            Background="{DynamicResource ComboDropdownNormal}" 
            MaxHeight="540" MinWidth="{TemplateBinding ActualWidth}" > 
          </Border> 
         </ContentControl> 
        </Popup> 

       </Grid> 

       <ControlTemplate.Triggers> 

        <Trigger Property="HasItems" Value="false"> 
         <Setter TargetName="DropDownBorder" Property="MinHeight" Value="95" /> 
        </Trigger> 
<!-- FAILS --> 
        <Trigger Property="IsDropDownOpen" Value="True"> 
         <Setter TargetName="imgArrow" Property="Image.Source" Value="{DynamicResource ComboBoxArrowHoverImage}" /> 
        </Trigger> 
        <Trigger Property="IsDropDownOpen" Value="False"> 
         <Setter TargetName="imgArrow" Property="Image.Source" Value="{DynamicResource ComboBoxArrowNormalImage}" /> 
        </Trigger> 
<!-- FAILS --> 
       </ControlTemplate.Triggers> 

      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

上述代码中的粗体触发器失败。任何援助将不胜感激。谢谢!

+0

不知道为什么我不能在我的代码中获得粗体。编辑器和添加标签似乎都不起作用。 –

回答

1

一个ControlTemplate触发将无法找到在ContentPresenterContentTemplateImage元素,但你可以直接将StyleImage元素本身并取出IsDropDownOpenControlTemplate触发:

<ContentPresenter Content="{TemplateBinding SelectionBoxItem}" > 
    <ContentPresenter.ContentTemplate> 
     <DataTemplate> 
      <Grid> 
       <TextBlock Text="{Binding}" /> 
       <Image x:Name="imgArrow" RenderOptions.BitmapScalingMode="HighQuality"> 
        <Image.Style> 
         <Style TargetType="Image"> 
          <Setter Property="Source" Value="{DynamicResource ComboBoxArrowNormalImage}" /> 
          <Style.Triggers> 
           <DataTrigger Binding="{Binding IsDropDownOpen, RelativeSource={RelativeSource AncestorType=ComboBox}}" Value="True"> 
            <Setter Property="Source" Value="{DynamicResource ComboBoxArrowHoverImage}" /> 
           </DataTrigger> 
          </Style.Triggers> 
         </Style> 
        </Image.Style> 
       </Image> 
      </Grid> 
     </DataTemplate> 
    </ContentPresenter.ContentTemplate> 
</ContentPresenter> 
+0

这工作......谢谢!我曾尝试过,但我认为我从样式中排除了TargetType。我需要添加到您的解决方案的唯一东西是“图像”。在前面的“来源”中。 –

0

在你方案,你应该使用DataTrigger

<DataTemplate> 
    <Grid> 
     <TextBlock Text="{Binding}" /> 
     <Image x:Name="imgArrow" 
       Source="{DynamicResource ComboBoxArrowNormalImage}" 
       RenderOptions.BitmapScalingMode="HighQuality" /> 
    </Grid> 
    <DataTemplate.Triggers> 
     <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ComboBox}, Path=IsDropDownOpen}" 
        Value="True"> 
      <Setter TargetName="imgArrow" 
        Property="Source" 
        Value="{DynamicResource ComboBoxArrowHoverImage}" /> 
     </DataTrigger> 
    </DataTemplate.Triggers> 
</DataTemplate> 

但是,我不能让你为什么把图像在ContentPresenter一个DataTemplate。我不确定这是正确的方式的造型。

如果你想改变图像的来源,而IsDropDownOpenTrue,一个方法就是把一切都是Grid

<Grid > 
    <ContentPresenter /> 
    <Image /> 
    <ToggleButton /> 
    <Popup/> 
</Grid> 

,并设置BackGround S和Trigger小号Propertly。

+0

感谢您的回答。我使用了mm8的解决方案,因为它更简单一些。 –