DataTrigger未在Silverlight中使用GoToStateAction

时间:2010-11-10 21:06:44

标签: 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>

如果我使用带有已加载值的 EventTrigger ,则会根据 IsActive Empty 状态>绑定。 如果我使用现有的 DataTrigger 并根据 IsActive 的绑定更改Stackpanel上的属性,例如Height,这也可以。

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

1 个答案:

答案 0 :(得分:7)

你需要GoToStateAction吗?

我猜,问题是Binding“在启动时”。我添加了一个调度程序,并在一秒后再次抛出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>

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

我希望这个答案可以帮助你。

BR,

TJ