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