Что является заменой для DataTrigger в Silverlight - PullRequest
18 голосов
/ 20 августа 2010

Это мой сценарий.

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

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

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

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

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

Ответы [ 4 ]

17 голосов
/ 11 ноября 2010

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

Поместите всю свою логику для того, что приводит вас в другое состояние в вашей модели представления.Выставьте состояние как перечисление.Откройте вкладку «Состояния».Создайте новую группу состояний (если у вас ее еще нет).Создайте свои штаты.На вкладке «Активы» выберите «Поведение».Перетащите поведение GoToState со вкладки «Активы» и поместите его в корневой визуальный элемент.На панели «Свойства» нажмите кнопку «Создать» рядом с типом триггера и выберите DataTrigger.Помните, что перечисление на вашей модели представления?Установите привязку триггера к состоянию перечисления на модели представления.Установите для параметра Trigger Value значение enum.Установите StateName в целевое состояние.

Теперь Blend должен был сгенерировать весь XAML VSM для вас.Как только вы освоитесь, вы увидите, что в некоторых сценариях вам даже не нужно перечисление модели представления - вы сможете полностью исключить состояние из представления.

13 голосов
/ 20 апреля 2011

Чтобы расширить пост Майка Поста, вот 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>
6 голосов
/ 17 сентября 2010

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

5 голосов
/ 08 декабря 2011

В блоге «Expression SDK в примере Silverlight – DataTrigger» достаточно хорошо это освещает.Вот пример того, что он делает:

<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"
...