2010-08-20 5 views
18

Это мой сценарий.Что такое замена DataTrigger в Silverlight

У меня есть 2 свойства. Тип и состояние.

Тип - это Enum с 3 значениями, например, мяч, автомобиль, стрелка. State - это int, который принимает 3 значения состояния, например, -1, 0, 1. Кроме того, у меня есть 9 изображений для каждого значения состояния.

Как, если я выбираю тип как шар и значение как -1, я хочу отобразить красный цветный шар. Если я выбираю тип как стрелку и значение как 1, я хочу отобразить стрелку вверх. и т. д.,

Я могу сделать это в WPF. Я создал 3 DataTemplates с пустым изображением. Затем я использую DataTrigger для проверки и обновления определенного изображения для выбранного StateValue.

Но, в Silverlight, как я могу это сделать. Я знаю, я должен сделать это в VSM. Но я хотел бы узнать некоторые подробности об этом (или) любых доступных альтернативах.

ответ

6

Я бы просто использовал конвертер, который берет ваш объект с 2 свойствами и возвращает изображение. Код, подобный этому в чистом XAML, болезнен и действительно принадлежит C#.

+0

Спасибо большое. Наконец, я получаю только конвертеры. –

17

Я бы использовал поведение GoToState с помощью DataTriggers в Silverlight. Довольно просто в Blend:

Положите всю свою логику на то, что приводит вас в другое состояние в вашей модели просмотра. Экспозиция состояния как перечисление. Откройте вкладку «Штаты». Создайте новую группу состояний (если у вас ее еще нет). Создайте свои состояния. На вкладке «Активы» выберите «Поведения». Перетащите поведение 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 в любом месте. –

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 префиксов i и ia определяется следующим образом :)

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
xmlns:ia="http://schemas.microsoft.com/expression/2010/interactions" 
Смежные вопросы