当从usercontrol内部触发自定义路由事件时,如何使用CallMethodAction调用viewmodel中的方法?

时间:2013-11-30 09:49:29

标签: events mvvm viewmodel routedevent

我有一个带有已注册路由事件的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));
    }

我在我的主视图中嵌入了这个用户控件,如下所示:

    Title="MainWindow" Height="350" Width="525">
<Grid>      
    <historicChart:HistoricChartControl></historicChart:HistoricChartControl>
</Grid>

我想通过在触发此事件时从我的Viewmodel调用方法来处理自定义路由事件。

我最初尝试过这个:

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

但这需要我反对MVVM,因为处理程序方法(VisualChartRangeChanged)将放在View而不是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.OnVisualChartRangeChanged'不是属性'EventName'的有效值。”}

通过在主视图的viewmodel中调用处理程序方法,是否有更好的技术来处理来自usercontrol的路由事件?

1 个答案:

答案 0 :(得分: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处理程序没有任何问题!保持简单。