protected virtual void OnBeforeNewViewModelAdded(object newDataContext, IHostAwareViewModel newViewModel) { }
void OnBeforeNewViewModelAddedInternal(object newDataContext, IHostAwareViewModel newViewModel) { if(newViewModel != null) { if (SUBSCRIPTION_AfterViewModelRaised != null) SUBSCRIPTION_AfterViewModelRaised.Dispose(); SUBSCRIPTION_AfterViewModelRaised = (newViewModel as ViewModel) // todo: update IViewModel interface .CreateWeakEventHandler() .ForEvent<AfterViewModelEventRaisedArgs>( (vm, h) => vm.AfterViewModelEventRaised += h, (vm, h) => vm.AfterViewModelEventRaised -= h) .Subscribe((vm, args) => OnAfterViewModelEventRaised(vm as ViewModel, args.Event, args.RoutingStrategy)); if (SUBSCRIPTION_FindDataContextInVisualTree != null) SUBSCRIPTION_FindDataContextInVisualTree.Dispose(); SUBSCRIPTION_FindDataContextInVisualTree = (newViewModel as ViewModel) .CreateWeakEventHandler() .ForEvent<SquaredInfinity.Foundation.Presentation.ViewModels.ViewModel.FindDataContextInVisualTreeEventArgs>( (vm, h) => vm.TryFindDataContext += h, (vm, h) => vm.TryFindDataContext -= h) .Subscribe((_s, _e) => { var vp = this.GetVisualOrLogicalParent(); while(vp != null) { var fe = vp as FrameworkElement; if(fe != null) { var dx = fe.DataContext; if(dx != null) { var result = (object) null; if(dx.TryConvert(_e.DataContextType, out result)) { _e.DataContext = result; _e.Handle(); return; } } // if fe is a View, try to convert view model to desired type var v = fe as View; if(v != null) { var vm = v.ViewModel; if(vm != null) { var result = (object)null; if(vm.TryConvert(_e.DataContextType, out result)) { _e.DataContext = result; _e.Handle(); return; } } } } vp = vp.GetVisualOrLogicalParent(); } }); } OnBeforeNewViewModelAdded(newDataContext, newViewModel); }
protected virtual void OnBeforeOldViewModelRemoved(object oldDataContext, IHostAwareViewModel oldViewModel) { }
void OnBeforeNewViewModelAddedInternal(object newDataContext, IHostAwareViewModel newViewModel) { if (newViewModel != null) { AfterViewModelRaisedSubscription = (newViewModel as ViewModel) // todo: update IViewModel interface .CreateWeakEventHandler() .ForEvent<AfterViewModelEventRaisedArgs>( (vm, h) => vm.AfterViewModelEventRaised += h, (vm, h) => vm.AfterViewModelEventRaised -= h) .Subscribe((vm, args) => OnAfterViewModelEventRaised(vm as ViewModel, args.Event, args.RoutingStrategy)); } OnBeforeNewViewModelAdded(newDataContext, newViewModel); }
void viewModel_modalInteractionCompleting(IHostAwareViewModel hostAwareViewModel) { // unsubscribe view model from this event (to prevent memory leak) hostAwareViewModel.InteractionCompleting -= viewModel_modalInteractionCompleting; // set dialog result on window Window window = hostAwareViewModel.ViewModelHost as Window; if (window != null && window.DialogResult == null) { switch (hostAwareViewModel.InteractionOutcome) { case UserInteractionOutcome.Cancelled: window.DialogResult = false; break; case UserInteractionOutcome.OtherSuccess: window.DialogResult = true; break; default: window.DialogResult = false; break; } } }
void viewModel_nonModalInteractionCompleting(IHostAwareViewModel hostAwareViewModel) { // unsubscribe view model from this event (to prevent memory leak) hostAwareViewModel.InteractionCompleting -= viewModel_nonModalInteractionCompleting; // set dialog result on window Window window = hostAwareViewModel.ViewModelHost as Window; if (window != null) { window.Close(); } }