2014-01-22 1 views
0

У меня есть элемент управления ListView со списком системных сообщений в нем, и соответствующую кнопку «действие», которое поможет мой пользователь разрешить сообщение:ListView Стиль Trigger затрагивающий один элемент управления, а не иначе

Example of problem

Если сообщение является сообщением об ошибке, я хочу, чтобы передняя часть текста и кнопка действия (часть [more ...]) стали красными. Как вы можете видеть, это не так.

Я использую Style.Trigger, связанный с серьезностью данных сообщений, чтобы установить Foreground. Это отлично работает для TextBlock в DataTemplate, но не влияет на кнопку в этом шаблоне. Моя XAML выглядит следующим образом:

<ListView x:Name="ImageCenterStatus" Background="{DynamicResource SC.ControlBrush}" Margin="10,22,10,0" FontSize="12" Grid.Column="1" ClipToBounds="True" ScrollViewer.HorizontalScrollBarVisibility="Disabled"> 
      <ListView.ItemTemplate> 
       <DataTemplate> 
        <WrapPanel> 
         <TextBlock TextWrapping="WrapWithOverflow" cal:Message.Attach="[Event MouseUp] = [Action DoStatusAction($dataContext)]" Text="{Binding Path=DisplayedMessage}"/> 
         <Button x:Name="ActionButton" Content="{Binding Path=DisplayedActionLabel}" FontSize="12" cal:Message.Attach="DoStatusAction($dataContext)" Style="{DynamicResource SC.ActionButtonHack}"></Button> 
        </WrapPanel> 
       </DataTemplate> 
      </ListView.ItemTemplate> 
      <ListView.ItemContainerStyle> 
       <Style TargetType="ListViewItem"> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding Path=Severity}" Value="Warning"> 
          <Setter Property="Foreground" Value="#FFCE7A16" /> 
         </DataTrigger> 
         <DataTrigger Binding="{Binding Path=Severity}" Value="Error"> 
          <Setter Property="Foreground" Value="#FFD13636" /> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </ListView.ItemContainerStyle> 
     </ListView> 

Кнопка имеет свой собственный стиль, SC.ActionButtonHack, но я очень осторожно, чтобы не переопределять на переднем плане в любом месте, что стиль:

  <Style x:Key="SC.ActionButtonHack" TargetType="{x:Type Button}"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type Button}"> 
         <ContentPresenter x:Name="contentPresenter" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0"/> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 

Почему TextBlock в DataTemplate отвечает на изменение Foreground в Trigger, но не на Button? Что мне нужно сделать, чтобы заставить кнопку уважать изменение переднего плана?

+0

Что на земле вашей 'SC.ActionButtonHack Стиль для? – Sheridan

+0

Для целей тестирования. У меня гораздо более сложный стиль, но я снимал его, чтобы сохранить этот пост коротким. –

+0

Это кажется справедливым. – Sheridan

ответ

1

Bind TextElement.Foreground из ContentPresenter в ListViewItem's foreground, чтобы заставить его работать:

<Style x:Key="SC.ActionButtonHack" TargetType="{x:Type Button}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Button}"> 
       <ContentPresenter x:Name="contentPresenter" 
           TextElement.Foreground="{Binding Foreground, 
           RelativeSource={RelativeSource Mode=FindAncestor, 
                AncestorType=ListViewItem}}" 
           HorizontalAlignment="Center" 
           VerticalAlignment="Center" Margin="0"/> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

ИЛИ

Либо привязать его на самой кнопке:

<Button x:Name="ActionButton" 
     Foreground="{Binding Foreground, RelativeSource={RelativeSource 
         Mode=FindAncestor, AncestorType=ListViewItem}}" 
     Content="{Binding Path=Name}" FontSize="12" 
     Style="{DynamicResource SC.ActionButtonHack}"/> 
+0

Это исправлено! Огромное спасибо. Итак ... почему триггер стиля работал на TextBlock, но не на Button? –

+0

Если вы посмотрите на кнопку controlTemplate по умолчанию, вы увидите, что ее значение по умолчанию установлено для свойства foreground в своем шаблоне, которое имеет более высокий приоритет, чем наследование свойств, поэтому он не наследует его родительский ListViewItem. Подробнее о порядке приоритета значения DP [здесь] (http://msdn.microsoft.com/en-us/library/ms743230 (v = vs.110) .aspx). –

+0

Но я не переопределяю по умолчанию ControlTemplate в своем стиле? Как по умолчанию все еще может повлиять на это? –

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