2013-11-01 3 views
3

У меня есть ToggleButton, который я нажимаю, чтобы всплывать FlowDocumentReader как Adorner. Этот FlowDocument является частью ControlTemplate с DataTrigger для отображения/скрытия элемента.Раскадровка не выполняется из ControlTemplate DataTrigger

Используя следующий триггер, все работает нормально. Я использую DataTrigger и некоторые сеттер, мой элемент отображается правильно с высотой и шириной я обеспечиваю, когда я просматриваю ToggleButton:

<ControlTemplate.Triggers> 
    <DataTrigger Binding="{Binding ElementName=adorner, Path=AdornedElement.IsChecked}" Value="True" > 
     <Setter TargetName="mainBorder" Property="Height" Value="437"></Setter> 
     <Setter TargetName="mainBorder" Property="Width" Value="537"></Setter> 
    </DataTrigger> 
</ControlTemplate.Triggers> 

Я хочу иметь некоторую анимацию, которая возникает, как кажется мой элемент, поэтому я попытался использовал Раскадровка. Это не работает, ничего не кажется, случается:

<ControlTemplate.Triggers> 
    <DataTrigger Binding="{Binding ElementName=adorner, Path=AdornedElement.IsChecked}" Value="True" > 
     <DataTrigger.EnterActions> 
      <BeginStoryboard> 
       <Storyboard Storyboard.TargetName="mainBorder"> 
        <DoubleAnimation Duration="0:0:0.2" Storyboard.TargetProperty="Width" To="537" /> 
        <DoubleAnimationUsingKeyFrames BeginTime="0:0:0.2" Duration="0:0:0.3" Storyboard.TargetProperty="Height"> 
         <LinearDoubleKeyFrame Value="417" KeyTime="0:0:0.2" /> 
         <LinearDoubleKeyFrame Value="437" KeyTime="0:0:0.24" /> 
         <LinearDoubleKeyFrame Value="417" KeyTime="0:0:0.3" /> 
        </DoubleAnimationUsingKeyFrames> 
       </Storyboard> 
      </BeginStoryboard> 
     </DataTrigger.EnterActions> 
     <DataTrigger.ExitActions> 
      <BeginStoryboard> 
       <Storyboard Storyboard.TargetName="mainBorder"> 
        <DoubleAnimationUsingKeyFrames Duration="0:0:0.2" Storyboard.TargetProperty="Width"> 
         <LinearDoubleKeyFrame Value="0" KeyTime="0:0:0.2" /> 
        </DoubleAnimationUsingKeyFrames> 
        <DoubleAnimationUsingKeyFrames BeginTime="0:0:0.2" Duration="0:0:0.2" Storyboard.TargetProperty="Height"> 
         <LinearDoubleKeyFrame Value="0" KeyTime="0:0:0.2" /> 
        </DoubleAnimationUsingKeyFrames> 
       </Storyboard> 
      </BeginStoryboard> 
     </DataTrigger.ExitActions> 
    </DataTrigger> 
</ControlTemplate.Triggers> 

ли раскадровка контекст совершенно иной, чем сеттер? Почему он работает в одном месте, но не в другом?

Как ни странно, когда я делаю это изменение, он вызывает ошибку привязки для отображения в окне вывода. Я не касался фактической привязки для DataTrigger, только содержание:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=adorner'. BindingExpression:Path=AdornedElement.IsChecked; DataItem=null; target element is 'Control' (Name=''); target property is 'NoTarget' (type 'Object')

Вот общая идея остальной части шаблона:

<ControlTemplate x:Key="LocalHelpWindow"> 
    <Grid> 
     <Grid.RowDefinitions> 
     ... 
     </Grid.RowDefinitions> 
     <help:AdornedPlaceholder x:Name="adorner" Grid.Row="0"/> 
     <Border Grid.Row="1" x:Name="mainBorder"> 
      ... 
     </Border> 
    </Grid> 
    <ControlTemplate.Triggers> 
     <DataTrigger Binding="{Binding ElementName=adorner, Path=AdornedElement.IsChecked}" Value="True" > 
      ... 
     </DataTrigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

ответ

2

Я думаю, в вашем случае вы должны использовать Триггер вместо DataTrigger. DataTrigger использует для привязки к некоторым данным в DataContext элемента, в котором применяется DataTemplate.

Я предлагаю вам попробовать использовать триггер таким образом:

<Trigger SourceName="adorner" Property="AdornedElement.IsChecked" Value="True"> 
    ... 
</Trigger>