【问题标题】:DataTrigger with VisualStates in Windows phone 8.1Windows phone 8.1 中带有 VisualStates 的 DataTrigger
【发布时间】:2014-12-15 18:40:54
【问题描述】:

我正在尝试将旧的 Window phone 7.5 Silverlight 应用程序转换为新的 WinRT Universal 应用程序,但这段代码有问题:

<Style TargetType="Button">
    <Setter Property="Visibility" Value="Collapsed"/>
    <Style.Triggers>
        <DataTrigger Binding="{Binding Active}" Value="True">
            <Setter Property="Visibility" Value="Visible"/>
        </DataTrigger>
    </Style.Triggers>
</Style>

我使用 DataTrigger 根据绑定值设置控件的可见性。

在 Windows Phone 8.1 winrt 应用程序中,此功能已失效。我已经尝试使用 VisualStates 来实现相同的功能,但我无法弄清楚。任何人都可以帮助我或以良好的榜样指导我。我被困在这里......

【问题讨论】:

    标签: winrt-xaml windows-phone-8.1 datatrigger visualstates


    【解决方案1】:

    DataTriggers are not available currently in WinRT,你有几个选择:

    • 使用VisualStateManager
    • 使用Behaviours managed API,例如这样:

      <Button xmlns:i="using:Microsoft.Xaml.Interactivity"
              xmlns:ic="using:Microsoft.Xaml.Interactions.Core">
          <Button.Style>
              <Style TargetType="Button">
                  <Setter Property="Visibility" Value="Collapsed"/>
              </Style>
          </Button.Style>
          <i:Interaction.Behaviors>
              <ic:DataTriggerBehavior Binding="{Binding Active}" Value="True" ComparisonCondition="Equal">
                  <ic:ChangePropertyAction PropertyName="Visibility" Value="Visible"/>
              </ic:DataTriggerBehavior>
          </i:Interaction.Behaviors>
      </Button>
      
    • 或者你可以使用适当的转换器绑定:

      <Button Visibility="{Binding Active, Converter={StaticResource BoolToVisibility}}"/>
      

    【讨论】:

    • 谢谢,为 W10 寻找解决方案已经有几分钟了 :)
    • @Romasz 这在导航到页面时效果很好,但在导航回该页面时似乎不会触发 DataTriggerBehavior。导航发生后我正在更改我的 ViewModel,但不知何故它没有被触发。任何想法为什么?
    • @Thierry 我不确定 - 没有代码很难说。我想您已经调试了该应用程序。在这种情况下,也许您可​​以在 SO 上提出新问题并在那里放置一些代码。
    • @Romasz 我已经调试过了,它仍然没有排序!我已经用一个包含依赖属性的类替换了 DataTriggerBehaviors,并且我已经将此属性绑定到 GoToState 并且发生了同样的问题!花了几个小时,并将继续努力,直到我找到解决方案或解决方法,但考虑到我可以清楚地看到我的 VM 的 prop 改变了它的值并且我可以看到它的改变,我无法指出哪里出了问题调整大小时的视图状态,但它只是在“返回”上一页时触发错误的状态。甚至不确定触发是正确的术语。