2013-11-30 2 views
0

У меня есть UserControl с зарегистрированным перенаправленным событием:Как использовать CallMethodAction для вызова метода внутри модели просмотра, когда пользовательское маршрутизируемое событие запускается из 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> 

и я хотел бы обработать настраиваемое маршрутизируемое событие, вызвав метод из моей модели просмотра, когда это событие запущено.

Я попробовал это на первый:

<Grid> 
    <historicChart:HistoricChartControl behaviours:ChartBehavior.OnVisualChartRangeChanged="VisualChartRangeChanged"/> 
</Grid> 

, но это требует, чтобы я идти против MVVM так как метод обработчика (VisualChartRangeChanged) будут размещены в представлении, а не в ViewModel.

Затем я попытался это:

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) не вызывается.

Может ли кто-нибудь указать пример, как это делается?

Спасибо.


EDITED

Так что я изменил код следующим образом:

 <i:Interaction.Triggers> 
      <i:EventTrigger EventName="{x:Static behaviours:ChartBehavior.OnVisualChartRangeChangedEvent}"> 
       <ei:CallMethodAction TargetObject="{Binding}" MethodName="MyMethod"/> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 

не только я вижу это: http://i.stack.imgur.com/xR9DY.jpg

, но даже если он компилируется, несмотря на уведомление изображенном я получить это внутреннее исключение:

{"'ChartBehavior.OnVisu alChartRangeChanged 'не является допустимым значением для свойства EventName. "}

Есть ли лучший способ обработки маршрутизируемого события из usercontrol путем вызова метода обработчика в режиме просмотра основного вида?

+0

Попробуйте что-то вроде этого '' для вашего 'i: EventTrigger'. – sthotakura

+0

Можете ли вы уточнить? Я сделал это и выбросил исключение: – guerillacodester

+0

вместо этого '', попробуйте код из моего пред. комментарий. И что было исключением? – sthotakura

ответ

0

Я уже опубликовал ответ на ваш другой идентичный вопрос. Обратите внимание, как имя события указывается как строка в ссылке и НЕ использует x: Static.

Вот ваш другой вопрос How to handle a custom RoutedEvent fired from a UserControl from inside the ViewModel?

А вот ссылка Custom RoutedEvent as EventTrigger

Так это сделать:

<EventTrigger RoutedEvent="behaviours:ChartBehavior.OnVisualChartRangeChanged"> 

Наконец я хочу добавить, что нет ничего плохого с вызовом обработчика ViewModel из внутри кода позади обработчика! Будь проще.

Смежные вопросы