2015-01-20 2 views
0

У меня есть следующее определение UserControlTrigger установить свойство в ItemTemplate

<UserControl x:Class="Logger.View.AdvancedToggleButton" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:converter="clr-namespace:Logger.Converter" 
      xmlns:commonControls="clr-namespace:Logger.CommonControls" 
      mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300" 
      DataContext="{Binding RelativeSource={RelativeSource Self}}"> 
    <UserControl.Resources> 
     <converter:CountToVisibilityConverter x:Key="CountToVisibilityConverter" /> 
    </UserControl.Resources> 
    <ItemsControl ItemsSource="{Binding LogElements, UpdateSourceTrigger=PropertyChanged}"> 
     <ItemsControl.Resources> 
      <Style TargetType="{x:Type ToggleButton}" > 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="{x:Type ToggleButton}"> 
          <Border HorizontalAlignment="Center" VerticalAlignment="Center" x:Name="container" 
            BorderThickness="1" Margin="1,2,1,1" Padding="2,2,4,2" BorderBrush="Black"> 
           <ContentPresenter x:Name="contentPresenter" /> 
          </Border> 
          <ControlTemplate.Triggers> 
           <Trigger Property="IsChecked" Value="True"> 
            <Setter Property="Background" TargetName="container" Value="{Binding SelectionBrush, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}"/> 
            <Setter Property="BorderThickness" TargetName="container" Value="1,1,1,0"></Setter> 
           </Trigger> 
           <Trigger Property="IsMouseOver" Value="True"> 
            <Setter Property="Cursor" Value="Hand"/> 
            <Setter Property="Background" TargetName="container" Value="{Binding SelectionBrush, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}"/> 
            <Setter Property="Background" Value="{Binding SelectionBrush, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}"/> 
           </Trigger> 
          </ControlTemplate.Triggers> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </ItemsControl.Resources> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <WrapPanel Orientation="Horizontal" /> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Horizontal"> 
        <ToggleButton Margin="2,1" 
         IsChecked="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" 
         Command="{Binding DataContext.ToggleCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}" 
         CommandParameter="{Binding}"> 
         <ToggleButton.Content> 
          <Grid> 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition Width="*" /> 
            <ColumnDefinition Width="Auto" /> 
            <ColumnDefinition Width="Auto" /> 
           </Grid.ColumnDefinitions> 
           <TextBlock Text="{Binding Name}" VerticalAlignment="Center" Margin="4,0,5,0" x:Name="tbText"/> 

           <Border Grid.Column="1" Margin="0,-1,-3,-1" MinWidth="20" 
             VerticalAlignment="Stretch" HorizontalAlignment="Center" 
             Background="Yellow" BorderBrush="LightGray" BorderThickness="1,0,0,0" 
             Visibility="{Binding WarningCount, Converter={StaticResource CountToVisibilityConverter}}" 
             Cursor="Hand"> 
            <commonControls:ActionLink HorizontalAlignment="Center" VerticalAlignment="Center" Text="{Binding WarningCount}" 
                 FontFamily="Consolas" Margin="2,0" Command="{Binding DataContext.NavigateToWarningCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}"/> 
           </Border> 

           <Border Grid.Column="2" Margin="3,-1,-3,-1" MinWidth="20" 
             VerticalAlignment="Stretch" HorizontalAlignment="Center" 
             Background="Red" BorderBrush="LightGray" BorderThickness="1,0,0,0" 
             Visibility="{Binding ErrorCount, Converter={StaticResource CountToVisibilityConverter}}" 
             Cursor="Hand" > 
            <commonControls:ActionLink HorizontalAlignment="Center" VerticalAlignment="Center" Text="{Binding ErrorCount}" 
                 FontFamily="Consolas" Foreground="White" Margin="2,0" /> 
           </Border> 
          </Grid> 
         </ToggleButton.Content> 
        </ToggleButton> 
       </StackPanel> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</UserControl> 

Все просто отлично работает. Теперь я добавил другое свойство к этому UserControl, чтобы установить BackgroundColor проверенных ToggleButton - TextBlock (tbText) на заданный SolidColorBrush.

Моя проблема в том, что я понятия не имею, как правильно установить триггер для этого.

Я попытался добавить триггер в ControlTemplate.Triggers, когда IsChecked - True. Но я не знаю, как получить доступ к tbText с этого момента. Является ли это правильным местом для триггера или мне нужно добавить еще один триггер на более низкий уровень?

+0

Не знаю, почему вы должны получить доступ к 'tbText' от стиля. 'tbText' - это имя * каждого * конкретного экземпляра' ToggleButton'; ваш стиль устанавливает свойства для * all * экземпляров. –

+0

Да. Но я хочу, чтобы стиль TextBox, который находится внутри ToggleButton, который проверяется в настоящее время. – Tomtom

ответ

1

Вашего ToggleButton.IsChecked свойство данные связан с вашей IsSelected собственности так по умолчанию, вы также хотите установить TextBlock.Background когда IsSelected свойства true. Вы можете сделать это так:

<TextBlock Text="{Binding Name}" VerticalAlignment="Center" Margin="4,0,5,0" 
    x:Name="tbText"> 
    <TextBlock.Style> 
     <Style TargetType="{x:Type TextBlock}"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding IsSelected}" Value="True"> 
        <Setter Property="Background" Value="{Binding YourColourBrush, 
         RelativeSource={RelativeSource AncestorType={x:Type 
         YourPrefix:YourUserControl}}}" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </TextBlock.Style> 

В качестве альтернативы, вы можете просто данные привязки непосредственно к ToggleButton.IsChecked собственности, как это:

<TextBlock Text="{Binding Name}" VerticalAlignment="Center" Margin="4,0,5,0" 
    x:Name="tbText"> 
    <TextBlock.Style> 
     <Style TargetType="{x:Type TextBlock}"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding IsChecked, RelativeSource={RelativeSource 
        AncestorType={x:Type ToggleButton}}}" Value="True"> 
        <Setter Property="Background" Value="{Binding YourColourBrush, 
         RelativeSource={RelativeSource AncestorType={x:Type 
         YourPrefix:YourUserControl}}}" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </TextBlock.Style> 

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

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