DataTrigger是不是在Silverlight

问题描述:

使用GoToStateAction后续XAML是一个对象,我试图建立在Expression Blend。我有与DataTrigger在StackPanel中的麻烦 - 该应用程序不会去当触发的数据相匹配。进一步的解释是这样的代码之后:DataTrigger是不是在Silverlight

<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结合。 如果我使用现有的DataTrigger并根据IsActive的绑定更改堆栈面板上的属性(如Height),这也适用。

我在做XAML的根本错误吗?你需要一个更完整的XAML例子来理解这个问题吗?

你需要的GoToStateAction?

我想,问题是绑定“在启动”。我添加了一个调度程序,并在一秒后再次抛出NotifyPropertyChanged。然后它工作。显然,你可以像这样解决这个问题。您等待控件加载完毕,然后再次抛出PropertyChanged。这不是一个好方法和类似于你的想法(如果我用一个加载值的EventTrigger,...)

我建议你使用DataStateBehaviour。如果你有一个布尔值来决定你必须去哪个坐垫,这很好。这是一种行为,您可以将条件绑定到属性,然后设置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