Как я могу получить WPF EventTrigger в триггере View, если он требует диктует базовую модель Viewmodel?
Здесь сценарий:
У меня есть следующий пользовательский элемент управления, идея состоит в том, что модель просмотра должна иметь возможность сигнализировать о том, что ему нужно "Активировать свечение", тем самым играя в раскадровку.
<UserControl x:Class="View.UnitView" ... >
...
<Storyboard x:Key="ActivateGlow">
...
</Storyboard>
...
<!-- INVALID BINDING! Not Dependancy Object-->
<EventTrigger RoutedEvent="{Binding OnActivateGlow}">
<BeginStoryboard Storyboard="{StaticResource ActivateGlow}"/>
</EventTrigger>
</UserControl>
в codebehind для UnitView, у меня есть:
public event EventHandler ActivateGlow;
и, как правило, в MVVM, у меня есть следующий DataTemplate для UnitViewModel:
<DataTemplate DataType="{x:Type vm:UnitViewModel}">
<vw:UnitView d:DesignWidth="150" d:DesignHeight="100" />
</DataTemplate>
Вопрос с ulitmate заключается в том, как я могу настроить что-то, чтобы viewmodel мог запустить событие OnActivateGlow?
Ответы
Ответ 1
Обновление: Firoso, как упоминалось в комментариях, вы должны иметь возможность (я думаю, т.е. непроверенный) иметь возможность использовать компоненты поведения blend для покрытия ваших требований.
В дополнение к загрузке и установке SDK. Получите копию библиотеки образцов сменного выражения (вам нужно будет щелкнуть по файлам Загрузка со следующей ссылки):
Примеры выражения для выражения
Эта библиотека содержит предустановленный триггер с именем DataEventTrigger, который вы можете использовать для запуска действий в ответ на событие, объявленное в вашей модели просмотра.
В SDK Blend уже есть (из того, что я могу сказать) другой фрагмент головоломки - он уже включает действие, которое позволяет вам управлять раскадрой. Имя этого действия - "ControlStoryboardAction".
В итоге вы получите некоторый xaml, который выглядит следующим образом:
<i:Interaction.Triggers>
<samples:DataEventTrigger EventName="YourEvent">
<im:ControlStoryboardAction Storyboard="{StaticResource Storyboard1}"
ControlStoryboardOption="Play"/>
</samples:DataEventTrigger>
</i:Interaction.Triggers>
Замените "YourEvent" на имя события, которое вы определили на своей модели просмотра, и замените "Storyboard1" на имя вашей раскадровки. Конечно, имена должны соответствовать точно.
Вот используемые определения пространства имен xaml:
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:im="clr-namespace:Microsoft.Expression.Interactivity.Media;assembly=Microsoft.Expression.Interactions"
xmlns:samples="clr-namespace:Expression.Samples.Interactivity;assembly=Expression.Samples.Interactivity"
Оригинальная публикация перед редактированием:
Предложите вам взглянуть на поведение выражения Expression Blend:
информация
Blend SDK
видео по поведению
Ответ 2
Вы также можете поместить логическое свойство IsGlowing на свою модель просмотра и использовать datatriggers в своем стиле
<Rectangle.Style>
<Style TargetType="{x:Type Rectangle}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsGlowing}" Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
...
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Rectangle.Style>
Ответ 3
Я считаю, что вам придется привязать к RoutedEvent
экземпляр, а не событие CLR.
Я не пробовал, но что-то вроде этого должно работать:
public class UnitView
{
public static readonly RoutedEvent ActivateGlowEvent
= EventManager.RegisterRoutedEvent(
"ActivateGlow", RoutingStrategy.Bubble,
typeof(RoutedEventHandler), typeof(UnitView)
);
public void RaiseActivateGlowEvent()
{
RaiseEvent(new RoutedEventArgs(ActivateGlowEvent));
}
}
Ответ 4
Один из способов найти это - использовать триггер данных на DataTemplate, который содержит вышеупомянутый элемент управления... вероятно, не лучший способ сделать это. Я все еще открыт для лучших идей.