Ответ 1
Я бы просто использовал конвертер, который берет ваш объект с двумя свойствами и возвращает изображение. Код, подобный этому в чистом XAML, болезнен и действительно принадлежит С#.
Это мой сценарий.
У меня есть 2 свойства. Тип и состояние.
Тип - это Enum с 3 значениями, например, мяч, автомобиль, стрелка. State - это int, который принимает 3 значения состояния, например, -1, 0, 1. Кроме того, у меня есть 9 изображений для каждого значения состояния.
Например, если я выбираю тип как шарик и значение как -1, я хочу отобразить красный цветный шар. Если я выберу тип как стрелку и значение как 1, я хочу отобразить стрелку вверх. и др.,
Я могу сделать это в WPF. Я создал 3 DataTemplates с пустым изображением. Затем я использую DataTrigger для проверки и обновления конкретного изображения для выбранного StateValue.
Но, в Silverlight, как я могу это сделать. Я знаю, я должен сделать это в VSM. Но я хотел бы узнать более подробную информацию об этом (или) доступных альтернативах.
Я бы просто использовал конвертер, который берет ваш объект с двумя свойствами и возвращает изображение. Код, подобный этому в чистом XAML, болезнен и действительно принадлежит С#.
Я бы использовал поведение GoToState с DataTriggers в Silverlight. Довольно просто в Blend:
Положите всю свою логику на то, что приводит вас в другое состояние в вашей модели представления. Вывести состояние как перечисление. Откройте вкладку "Штаты". Создайте новую группу состояний (если у вас ее еще нет). Создайте свои состояния. На вкладке "Активы" выберите "Поведения". Перетащите поведение GoToState со вкладки "Активы" и отбросьте его на свой корневой визуальный элемент. На панели "Свойства" нажмите кнопку "Создать" рядом с параметром TriggerType и выберите "DataTrigger". Помните, что перечисление на вашей модели просмотра? Установите привязку триггера к перечислению состояния в модели представления. Установите значение триггера в значение перечисления. Установите StateName в целевое состояние.
Теперь Blend должен сгенерировать все VSM XAML для вас. Как только вы узнаете о вещах, вы увидите, как в некоторых сценариях вам даже не понадобится перечисление на модели представления - вы сможете полностью отключить состояние от представления.
Чтобы развернуть на 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>
Сообщение в блоге "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"