我有一个带有注册路由事件的 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' 的有效值。"}
是否有更好的技术通过调用主视图的视图模型中的处理程序方法来处理来自用户控件的路由事件?