银光中DataTrigger的替代品是什么?

18

这是我的情况。

我有两个属性:Type和State。

Type是一个枚举类型,有3个值,例如 ball(球)、car(汽车)、arrow(箭头)。State是一个整数,可以接受3个状态值,例如-1、0、1。另外,我有每个状态值对应的9张图片。

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

我能够在WPF中完成此操作。我创建了3个带有空白图像的DataTemplates。然后,我使用DataTrigger来检查并更新所选StateValue的特定图像。

但是,在Silverlight中我该如何做呢?我知道我必须在VSM中进行操作。但是,我想了解更多有关此操作的详细信息或任何可用的替代方法。

4个回答

17
我会在Silverlight中使用GoToState行为和DataTriggers。非常简单,只需在Blend中完成以下步骤:
1. 将触发状态转换的逻辑放入视图模型中。 2. 将状态公开为枚举。 3. 打开“States”选项卡。 4. 创建一个新的状态组(如果您还没有一个)。 5. 创建您的状态。 6. 从“Assets”选项卡中选择“Behaviors”。 7. 将GoToState行为从“Assets”选项卡中拖动到您的根视觉元素上。 8. 在属性面板中,单击TriggerType旁边的“New”按钮,然后选择DataTrigger。 9. 记住视图模型中的枚举?将触发器绑定设置为视图模型上的状态枚举。 10. 设置触发器值为枚举的值。 11. 将StateName设置为目标状态。
Blend现在应该已经为您生成了所有的VSM XAML。一旦您熟悉了这些步骤,您将看到,在某些情况下甚至不需要在视图模型中使用枚举,您将能够完全通过视图来驱动状态。

14

为了补充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>

1
你有没有可能构建这个示例?我在网上找不到一个漂亮、完整的XAML示例。 - Drew Noakes

6

我建议您使用一个将具有2个属性的对象转换为图像的转换器。在纯XAML中编写此类代码非常麻烦,而且更适合使用C#。


非常感谢。最后,我只使用转换器。 - Prince Ashitaka

5

这篇博客文章“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命名空间前缀和:)
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:ia="http://schemas.microsoft.com/expression/2010/interactions"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接