DataTrigger не использует GoToStateAction в Silverlight - PullRequest
2 голосов
/ 11 ноября 2010

Следующий XAML представляет объект, который я пытаюсь построить в Expression Blend. У меня проблемы с DataTrigger в StackPanel - приложение не переходит в Пусто , когда триггер совпадает с данными. Дальнейшее объяснение после этого кода:

  <DataTemplate x:Key="SampleTemplate">
   <StackPanel x:Name="SampleStack" Style="{StaticResource DefaultSampleStyle}" Width="64" Height="60">
    <VisualStateManager.VisualStateGroups>
     <VisualStateGroup x:Name="VisualStateGroup">
      <VisualStateGroup.Transitions>
       <VisualTransition GeneratedDuration="0">
        <Storyboard>
         <ColorAnimation Duration="0" To="#FFDFE04B" Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)" Storyboard.TargetName="SampleStack" d:IsOptimized="True"/>
        </Storyboard>
       </VisualTransition>
      </VisualStateGroup.Transitions>
      <VisualState x:Name="Empty">
       <Storyboard>
        <ColorAnimation Duration="0" To="#FF4B6FE0" Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)" Storyboard.TargetName="SampleStack" d:IsOptimized="True"/>
       </Storyboard>
      </VisualState>
     </VisualStateGroup>
    </VisualStateManager.VisualStateGroups>
    <VisualStateManager.CustomVisualStateManager>
     <ei:ExtendedVisualStateManager/>
    </VisualStateManager.CustomVisualStateManager>
    <i:Interaction.Triggers>
     <ei:DataTrigger Binding="{Binding IsActive}" Value="False">
      <ei:GoToStateAction StateName="Empty" UseTransitions="False"/>
     </ei:DataTrigger>
    </i:Interaction.Triggers>
    <TextBlock x:Name="StartOn" Text="{Binding StartOn, StringFormat=hh:mm}"/><TextBlock x:Name="textBlock" Text="-" />    
    <TextBlock x:Name="EndOn" Text="{Binding EndOn, StringFormat=hh:mm}"/>
   </StackPanel>
  </DataTemplate>

Если я использую EventTrigger со значением Loaded , состояние Пустой правильно применяется на основе привязки IsActive . Если я использую существующий DataTrigger и изменяю свойство на панели стека, например, высоту, на основе привязки IsActive , это также работает.

Я делаю что-то в корне неправильно в XAML? Вам нужен более полный пример XAML, чтобы понять проблему?

1 Ответ

7 голосов
/ 11 ноября 2010

вам нужно GoToStateAction?

Думаю, проблема в привязке "при запуске". Я добавил диспетчера и через одну секунду снова выбросил NotifyPropertyChanged. Тогда это работает. Вероятно, вы можете обойти это так. Вы ждете, пока элемент управления загрузится, а затем снова выбрасываете PropertyChanged. Это не очень хороший способ и похож на вашу идею (если я использую EventTrigger со значением Loaded, ...)

Я бы порекомендовал вам использовать DataStateBehaviour. Если у вас есть логическое значение, чтобы решить, в каком сатте вы должны идти, это здорово. Это поведение, при котором вы можете связать условие со свойством, а затем установить истинное и ложное состояние.

Это будет выглядеть так (я сделал несколько настроек только для тестирования на моем компьютере):

<DataTemplate x:Key="SampleTemplate">
            <StackPanel x:Name="SampleStack" Width="64" Height="60" Background="White">
                <i:Interaction.Behaviors>
                    <ei:DataStateBehavior Binding="{Binding IsChecked}" Value="True" TrueState="Empty" FalseState="Base"/>
                </i:Interaction.Behaviors>
                <VisualStateManager.VisualStateGroups>
                    <VisualStateGroup x:Name="VisualStateGroup">
                        <VisualStateGroup.Transitions>
                            <VisualTransition GeneratedDuration="0"/>
                        </VisualStateGroup.Transitions>
                        <VisualState x:Name="Empty">
                            <Storyboard>
                                <ColorAnimation Duration="0" To="Red" Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)" Storyboard.TargetName="SampleStack" d:IsOptimized="True"/>
                            </Storyboard>
                        </VisualState>
                        <VisualState x:Name="Base"/>
                    </VisualStateGroup>
                </VisualStateManager.VisualStateGroups>
                <VisualStateManager.CustomVisualStateManager>
                    <ei:ExtendedVisualStateManager/>
                </VisualStateManager.CustomVisualStateManager>
                <TextBlock x:Name="StartOn" Text="Test"/>
            </StackPanel>
        </DataTemplate>

Как видите, я добавил второе состояние в VisualStateGroup (там теперь пустое и базовое). Я бы порекомендовал это не только потому, что DataStateBehaviour нужно как минимум два состояния в одной группе. Если у вас только одно состояние, у вас нет шансов изменить состояние этой группы на нормальное, например,

Надеюсь, этот ответ поможет вам.

BR

TJ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...