我有一个带有已注册路由事件的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的路由事件?
答案 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处理程序没有任何问题!保持简单。