2017-02-18 11 views
0

Я хотел бы отображать различные изображения combobox на основе IsDropDownOpen. Не знаете, как правильно обращаться к «imgArrow».XAML ControlTemplate Trigger Fails for DataTemplate

<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 триггер не сможет найти Image элемент в ContentTemplate из ContentPresenter, но вы могли бы применить Style к Image сам элемент непосредственно и удалить IsDropDownOpen триггеры из ControlTemplate:

<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> 

Однако, я не могу, почему вы положили изображение в DataTemplate в ContentPresenter. Я не уверен, что это в правильном направлении стиля.

Если вы хотите изменить на источник изображения, в то время как IsDropDownOpen является True, один способ поставить все это Grid:

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

и установить BackGround с и Trigger сек Propertly.

+0

Спасибо за ответ. Я пошел с решением от mm8, потому что это было немного проще. –

 Смежные вопросы

  • Нет связанных вопросов^_^