2017-02-18 72 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的解決方案,因爲它更簡單一些。 –