【问题标题】:What is the replacement for DataTrigger in SilverlightSilverlight 中 DataTrigger 的替代品是什么
【发布时间】:2011-04-01 13:34:59
【问题描述】:

这是我的场景。

我有 2 个属性。类型和状态。

Type 是一个具有 3 个值的枚举,例如球、汽车、箭头。 State 是一个 int,可以接受 3 个状态值,例如 -1、0、1。此外,每个状态值都有 9 个图像。

例如,如果我选择类型为球,值选择为 -1,我想显示一个红色球。 如果我选择类型作为箭头并将值选择为 1,我想显示一个向上箭头。等等,

我可以在 WPF 中做到这一点。我创建了 3 个带有空图像的 DataTemplates。然后,我使用 DataTrigger 检查和更新所选 StateValue 的特定图像。

但是,在 Silverlight 中,我怎么能做到这一点。我知道,我必须在 VSM 中进行。但是,我想了解有关此(或)任何可用替代方案的更多详细信息。

【问题讨论】:

    标签: silverlight silverlight-4.0 datatrigger vsm


    【解决方案1】:

    我会在 Silverlight 中将 GoToState 行为与 DataTriggers 一起使用。 Blend非常简单:

    把你所有的逻辑放在你的视图模型中,让你进入不同的状态。 将状态公开为枚举。 打开状态选项卡。 创建一个新的状态组(如果您还没有)。 创建你的状态。 从资产选项卡中,选择行为。 将 GoToState 行为从 Assets 选项卡拖放到您的根视觉元素上。 在“属性”面板中,单击 TriggerType 旁边的“新建”按钮并选择 DataTrigger。 还记得视图模型上的那个枚举吗?将触发器绑定设置为视图模型上的状态枚举。 将触发值设置为枚举的值。 将 StateName 设置为目标状态。

    Blend 现在应该已经为您生成了所有的 VSM XAML。一旦掌握了窍门,您就会发现在某些情况下,您甚至不需要视图模型上的枚举——您将能够完全摆脱视图的状态。

    【讨论】:

      【解决方案2】:

      为了扩展 Mike Post 的帖子,这里是 XAML,以防您没有 Blend。

      您需要添加对 Microsoft.Expression.Interactions 和 System.Windows.Interactivity 的引用。

      xmlns:ia="clr-namespace:Microsoft.Expression.Interactivity.Core;assembly=Microsoft.Expression.Interactions" 
      xmlns:iv="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
      

      然后在您的控件中,在与 VisualStateManager 相同的级别放置:

      <iv:Interaction.Triggers>
          <ia:DataTrigger Binding="{Binding PropertyName}" Value="PropertyValue"  >
              <ia:GoToStateAction StateName="StateName" />
          </ia:DataTrigger>
      </iv:Interaction.Triggers>
      

      【讨论】:

      • 你有机会建立这个例子吗?我无法在任何地方在线找到一个不错的、完整的 XAML 示例。
      【解决方案3】:

      我只是使用一个转换器,它可以获取具有 2 个属性的对象并返回一个图像。纯 XAML 中的类似代码很痛苦,并且确实属于 C#。

      【讨论】:

      • 非常感谢。最后,我只剩下转换器了。
      【解决方案4】:

      博文"Expression SDK in Silverlight–DataTrigger Example" 很好地涵盖了它。以下是他的工作示例:

      <i:Interaction.Triggers>
          <ia:DataTrigger Binding="{Binding IsEnabled}" Comparison="Equal" Value="false">
              <ia:ControlStoryboardAction Storyboard="{StaticResource DisableStoryboard}"></ia:ControlStoryboardAction>
          </ia:DataTrigger>
      
          <ia:DataTrigger Binding="{Binding IsEnabled}" Comparison="Equal" Value="true">
              <ia:ControlStoryboardAction Storyboard="{StaticResource EnableStoryboard}"></ia:ControlStoryboardAction>
          </ia:DataTrigger>
      </i:Interaction.Triggers>
      

      (两个 XML 命名空间前缀 iia 定义如下:)

      xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
      xmlns:ia="http://schemas.microsoft.com/expression/2010/interactions"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-22
        • 2011-05-07
        • 2012-04-24
        • 2019-12-03
        • 2010-09-17
        • 2012-03-27
        • 2012-09-30
        • 2010-10-20
        相关资源
        最近更新 更多