private List <ViewModelBase> SetBingingContextForChildren <TParentViewModel, TParam, TResult>( Page view, ViewModelBase parentViewModel, TParam param, Action <TParentViewModel> parentViewModelInitialization, CallbackParam <TResult> callbackParam) where TParentViewModel : ViewModelBase { var resultChildren = new List <ViewModelBase>(); var childViews = view is TabbedPage tabbedPage ? tabbedPage.Children : view is FlyoutPage flyoutPage ? new[] { flyoutPage.Flyout, flyoutPage.Detail } : Array.Empty <Page>(); foreach (var childView in childViews) { var currentView = childView is NavigationPage navigationPage ? navigationPage.RootPage : childView; var currentViewModel = null as ViewModelBase; if (!currentView.GetType().IsDefined(typeof(ParentBindingContextAttribute))) { var viewModelType = _navigationMapper.GetViewModelTypeFor(currentView); currentViewModel = (ViewModelBase)_resolver.Resolve(viewModelType, param); if (currentViewModel is TParentViewModel parentViewModelType) { parentViewModelInitialization?.Invoke(parentViewModelType); } currentView.BindingContext = currentViewModel; currentView.Appearing += (sender, args) => currentViewModel.OnAppearing(); currentView.Appearing += async(sender, args) => await currentViewModel.OnAppearingAsync(); currentView.Disappearing += (sender, args) => currentViewModel.OnDisappearing(); currentView.Disappearing += async(sender, args) => await currentViewModel.OnDisappearingAsync(); } var children = SetBingingContextForChildren( currentView, currentViewModel ?? parentViewModel, param, parentViewModelInitialization, callbackParam); if (currentViewModel != null) { resultChildren.Add(currentViewModel); _viewModelWrapperStorage.Add(currentViewModel, new ViewModelWrapper <TResult>(callbackParam) { Parent = parentViewModel, Children = children }); } else { resultChildren.AddRange(children); } } return(resultChildren); }