Чем заменить DataTrigger в Silverlight

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

У меня 2 объекта недвижимости. Тип и состояние.

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

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

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

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


person Prince Ashitaka    schedule 20.08.2010    source источник


Ответы (4)


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

person Judah Gabriel Himango    schedule 17.09.2010
comment
Большое спасибо. В конце концов, я остаюсь только с конвертерами. - person Prince Ashitaka; 17.09.2010

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

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

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

person Mike Post    schedule 11.11.2010

Чтобы расширить сообщение Майка Поста, вот 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>
person Ray    schedule 20.04.2011
comment
Есть ли шанс, что вы могли бы построить этот пример? У меня проблемы с поиском хорошего, полного примера в XAML в Интернете в любом месте. - person Drew Noakes; 13.09.2011

Сообщение в блоге " 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"
person Xcalibur37    schedule 08.12.2011