2016-02-24 2 views
1

Я пытаюсь открыть всплывающее окно в соответствии с изменением данных в моем ViewModel:Popup открытым вызвано DataTrigger

Popup определяется как это:

<Popup x:Name="popup" 
AllowsTransparency="True" 
Focusable="False" 
IsHitTestVisible="False" 
Placement="Bottom" 
PopupAnimation="Slide" 
StaysOpen="False">... </Popup> 

И у меня есть пользовательский элемент управления

<UserControl> 
... 
<ControlTemplate> 
    <ControlTemplate.Triggers> 
    <DataTrigger Binding="{Binding PopupOpened}" Value="True"> 
     <DataTrigger.EnterActions> 
      <BeginStoryboard Storyboard="{StaticResource ShowPopup}"/> 
     </DataTrigger.EnterActions> 
    </DataTrigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 
</UserControl> 

И моя анимация определяется как (в ресурсах):

<Storyboard x:Key="ShowPopup"> 
<BooleanAnimationUsingKeyFrames Storyboard.TargetName="popup" Storyboard.TargetProperty="(Popup.IsOpen)"> 
        <DiscreteBooleanKeyFrame KeyTime="00:00:00.00" Value="True" /> 
       </BooleanAnimationUsingKeyFrames> 
      </Storyboard> 

Если я запускаю эту анимацию из EventTrigger на триггеры некоторых элементов управления (например, кнопка), она работает правильно.

Это неправильно работает внутри DataTrigger.

EDIT:

Я нашел проблему: Если вы управляете Popup.IsOpen свойство с анимацией + связывание, связывание с этим свойством будет работать только пока вы будете использовать анимацию, чтобы изменить это свойство. После этого привязка больше не будет работать. Поэтому вы всегда должны изменять свойство IsOpen посредством анимации или привязки, не смешивая!

ответ

0

В вашем примере есть несколько ошибок, которые скрывают реальную проблему. Ваш элемент DataTrigger не закрыт, а «StaticResources» должен быть StaticResource.

Но в конечном счете шаблон для UserControl не используется правильно, вы пропустили настройку UserControl.Template. Если мы это исправить, мы увидим исключение:

<UserControl> 
    <UserControl.Template> 
     <ControlTemplate> 
      <ControlTemplate.Triggers> 
       <DataTrigger Binding="{Binding PopupOpened}" Value="True"> 
        <DataTrigger.EnterActions> 
         <BeginStoryboard Storyboard="{StaticResource ShowPopup}" /> 
        </DataTrigger.EnterActions> 
       </DataTrigger> 
      </ControlTemplate.Triggers> 
      <!-- Some content for template to have substance --> 
      <TextBlock /> 
     </ControlTemplate> 
    </UserControl.Template> 
</UserControl> 

Вот результат:

название «всплывающее окно» не может быть найдено в названии рамки «System.Windows.Controls.ControlTemplate ».

Самый простой способ на самом деле сделать это, ИМО, это простое прямое связывание:

<Popup x:Name="popup" 
     IsOpen="{Binding PopupOpened, Mode=TwoWay}"> 

Или, если вам действительно нужен триггер, вы можете переместить его Всплывающие себя:

<Popup x:Name="popup"> 
    <Popup.Style> 
     <Style> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding PopupOpened}" Value="True"> 
        <DataTrigger.EnterActions> 
         <BeginStoryboard> 
          <Storyboard> 
           <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsOpen"> 
            <DiscreteBooleanKeyFrame KeyTime="00:00:00.00" Value="True" /> 
           </BooleanAnimationUsingKeyFrames> 
          </Storyboard> 
         </BeginStoryboard> 
        </DataTrigger.EnterActions> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Popup.Style> 

    <TextBlock /> 
</Popup>