static void CreateAndRaiseNewEventArgs(object sender, ViewModelEventRoutedEventArgs e) { var v = sender as View; var target = GetTarget(v); var new_e2 = new ViewModelEventRoutedEventArgs(e.ViewModelEventArgs, e.RoutedEvent, e.Source); target.RaiseEvent(new_e2); if (new_e2.Handled) e.Handled = true; }
void View_ViewModelMessage(object sender, ViewModelEventRoutedEventArgs args) { OnViewModelEventInternal(args); }
void OnViewModelEventInternal(ViewModelEventRoutedEventArgs args) { if (ViewModel == null) return; if (args.RoutedEvent.RoutingStrategy == RoutingStrategy.Bubble) { // todo: update interface (ViewModel as ViewModel).OnPreviewViewModelEventInternal(args.ViewModelEventArgs); return; } if (args.RoutedEvent.RoutingStrategy == RoutingStrategy.Tunnel) { // todo: update interface (ViewModel as ViewModel).OnViewModelEventInternal(args.ViewModelEventArgs); return; } }
void RaiseViewModelEvent(IViewModel vm, IViewModelEvent ev, ViewModelEventRoutingStrategy routingStrategy) { if (routingStrategy.HasFlag(ViewModelEventRoutingStrategy.Bubble)) { var preview_args = new ViewModelEventArgs(vm, ev, ViewModelEventRoutingStrategy.Bubble); // Raise Bubbling WPF Routed Event var wpf_preview_args = new ViewModelEventRoutedEventArgs(preview_args, PreviewViewModelEventProperty, this); RaiseEvent(wpf_preview_args); if (wpf_preview_args.Handled || preview_args.IsHandled) return; } if (routingStrategy.HasFlag(ViewModelEventRoutingStrategy.Tunnel)) { var args = new ViewModelEventArgs(vm, ev, ViewModelEventRoutingStrategy.Tunnel); // Raise Tunneling WPF Routed Event var wpf_args = new ViewModelEventRoutedEventArgs(args, ViewModelEventProperty, this); RaiseEvent(wpf_args); if (wpf_args.Handled || args.IsHandled) return; } if(routingStrategy.HasFlag(ViewModelEventRoutingStrategy.BroadcastToChildren)) { // search visual tree for children deriving from View var children = this.VisualTreeTraversal( includeChildItemsControls: true, traversalMode: TreeTraversalMode.BreadthFirst) .OfType<View>(); var args = new ViewModelEventArgs(vm, ev, ViewModelEventRoutingStrategy.BroadcastToChildren); foreach (var v in children) { v.OnViewModelEventInternal(args); if (args.IsHandled) return; } } }
static void Source_ViewModelEvent(object sender, ViewModelEventRoutedEventArgs e) { CreateAndRaiseNewEventArgs(sender, e); }