2010-08-20 65 views
18

这是我的场景。什么是Silverlight中DataTrigger的替代品

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

类型是具有3个值的枚举,例如球,车,箭头。状态是一个int,它可以接受3个状态值,例如,-1,0,1。另外,每个状态值有9个图像。

像,如果我选择类型为球和值为-1,我想显示一个红色的球。 如果我选择箭头类型和值为1,我想显示向上的箭头。

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

但是,在silverlight中我该怎么做。我知道,我必须在VSM中做到这一点。但是,我想知道更多关于这个(或)任何可用替代方法的细节。

回答

6

我只是使用一个转换器,将您的对象与2个属性并返回一个图像。像纯XAML这样的代码很痛苦,而且真的属于C#。

+0

非常感谢。最后,我最终只用转换器。 – 2010-09-17 19:55:23

17

我会在Silverlight中使用带有DataTriggers的GoToState行为。在Blend中很简单:

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

Blend现在应该已经为您生成了所有的VSM XAML。一旦你掌握了一些东西,你会看到在某些情况下你甚至不需要在视图模型上使用枚举 - 你可以完全脱离视图。

13

要扩展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上找到一个很好,完整的示例。 – 2011-09-13 13:06:15

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命名空间前缀iia被定义如下:)

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