DataTrigger未在Silverlight中使用GoToStateAction

Jas*_*son 2 silverlight xaml

以下XAML表示我尝试在Expression Blend中构建的对象.我在StackPanel中遇到DataTrigger问题 - 当触发器匹配数据时,应用程序不会转到Empty.在此代码之后进一步说明:

  <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>
Run Code Online (Sandbox Code Playgroud)

如果我使用带有Loaded值的EventTrigger,则会根据IsActive绑定正确应用Empty状态.如果我使用现有的DataTrigger并根据IsActive的绑定更改Stackpanel上的Property(例如Height),这也可以.

我在XAML中做了一些根本错误的事情吗?您是否需要更完整的XAML示例才能理解该问题?

Ter*_*son 7

你需要GoToStateAction吗?

我猜,问题是绑定"在启动时".我添加了一个调度程序,并在一秒后再次抛出NotifyPropertyChanged.然后它工作.你可以这样解决它.等到加载控件然后再次抛出PropertyChanged.这不是一个很好的方式,类似于你的想法(如果我使用带有Loaded值的EventTrigger,...)

我建议你使用DataStateBehaviour.如果你有一个布尔值来决定你必须去哪个satte,这很好.这是一种行为,您可以将条件绑定到属性,然后设置true和false状态.

它看起来像这样(我做了一些调整只是为了在我的电脑上进行测试):

<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>
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我向VisualStateGroup添加了第二个状态(现在有空和基数).我建议这不仅是因为DataStateBehaviour在一个组中至少需要两个状态.如果您只有一个州,则您没有机会将该组的状态恢复正常,例如

我希望这个答案可以帮到你.

BR,

TJ