以下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示例才能理解该问题?
答案 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