0

我有一个带有注册路由事件的 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) 将放置在视图中而不是视图模型中。

然后我尝试了这个:

    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>

我不仅看到了这个:http: //i.stack.imgur.com/xR9DY.jpg

但即使它编译尽管显示的通知,我得到这个内部异常:

{"'ChartBehavior.OnVisualChartRangeChanged' 不是属性 'EventName' 的有效值。"}

是否有更好的技术通过调用主视图的视图模型中的处理程序方法来处理来自用户控件的路由事件?

4

1 回答 1

0

我已经发布了对您其他相同问题的答案。请注意事件名称如何在链接中指定为字符串,而不是使用 x:Static。

这是您的另一个问题 如何处理从 ViewModel 内部的 UserControl 触发的自定义 RoutedEvent?

这是链接Custom RoutedEvent as EventTrigger

所以这样做:

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

最后我想补充一点,从处理程序后面的代码中调用 ViewModel 处理程序没有任何问题!把事情简单化。

于 2013-12-01T22:33:09.133 回答