示例#1
0
        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);
        }