Подтвердить что ты не робот

Что такое замена DataTrigger в Silverlight

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

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

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

Чтобы развернуть на 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>

Ответ 4

Сообщение в блоге "Expression SDK в 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"