Как использовать CallMethodAction для вызова метода внутри viewmodel, когда пользовательское перенаправленное событие запускается изнутри usercontrol?
У меня есть UserControl с зарегистрированным перенаправленным событием:
public static readonly RoutedEvent OnVisualChartRangeChangedEvent =
EventManager.RegisterRoutedEvent("OnVisualChartRangeChanged",
RoutingStrategy.Bubble, typeof(OnScrollChangedHandler), typeof(ChartBehavior));
public event OnScrollChangedHandler OnVisualChartRangeChanged
{
add { AssociatedObject.AddHandler(OnVisualChartRangeChangedEvent, value); }
remove { AssociatedObject.RemoveHandler(OnVisualChartRangeChangedEvent, value); }
}
Я запускаю это перенаправленное событие из пользовательского элемента управления следующим образом:
protected virtual void OnScrollEvent(object oldValue, object newValue)
{
AssociatedObject.RaiseEvent(new DateTimeEventArgs(OnVisualChartRangeChangedEvent, minDate, maxDate));
}
Я вставил этот usercontrol в мой основной вид следующим образом:
Title="MainWindow" Height="350" Width="525">
<Grid>
<historicChart:HistoricChartControl></historicChart:HistoricChartControl>
</Grid>
и я хотел бы обработать пользовательское перенаправленное событие, вызывая метод из моей Viewmodel при запуске этого события.
Я попробовал это сначала:
<Grid>
<historicChart:HistoricChartControl behaviours:ChartBehavior.OnVisualChartRangeChanged="VisualChartRangeChanged"/>
</Grid>
но это требует, чтобы я пошел против MVVM, так как метод-обработчик (VisualChartRangeChanged) будет размещен в представлении, а не в модели представления.
Затем я попробовал это:
Title="MainWindow" Height="350" Width="525">
<Grid>
<!--behaviours:ChartBehavior.OnVisualChartRangeChanged="RoutedEventHandler"-->
<historicChart:HistoricChartControl>
<i:Interaction.Triggers>
<i:EventTrigger EventName="OnVisualChartRangeChanged">
<ei:CallMethodAction TargetObject="{Binding}" MethodName="MyMethod"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</historicChart:HistoricChartControl>
</Grid>
но метод обработчика событий (MyMethod) не вызывается.
Может кто-нибудь привести пример того, как это делается?
Благодарю.
РЕДАКТИРОВАНИЕ
Поэтому я изменил код следующим образом:
<i:Interaction.Triggers>
<i:EventTrigger EventName="{x:Static behaviours:ChartBehavior.OnVisualChartRangeChangedEvent}">
<ei:CallMethodAction TargetObject="{Binding}" MethodName="MyMethod"/>
</i:EventTrigger>
</i:Interaction.Triggers>
но даже если он компилируется, несмотря на показанное уведомление, я получаю следующее внутреннее исключение:
{"ChartBehavior.OnVisualChartRangeChanged" не является допустимым значением свойства 'EventName'."}
Есть ли лучший метод для обработки перенаправленного события из usercontrol путем вызова метода-обработчика в viewmodel основного представления?
1 ответ
Я уже отправил ответ на другой твой идентичный вопрос. Обратите внимание, как имя события указывается в виде строки в ссылке, а НЕ с использованием x:Static.
Вот еще один вопрос: как обработать пользовательское RoutedEvent, запущенное из UserControl из ViewModel?
А вот ссылка Custom RoutedEvent как EventTrigger
Так что сделайте это:
<EventTrigger RoutedEvent="behaviours:ChartBehavior.OnVisualChartRangeChanged">
Наконец, я хочу добавить, что нет ничего плохого в вызове вашего обработчика ViewModel из кода, стоящего за обработчиком! Будь проще.