2010-08-20 78 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"