Как использовать 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 из кода, стоящего за обработчиком! Будь проще.

Другие вопросы по тегам