コード例 #1
0
        public virtual async Task <TResult> Navigate <TParameter, TResult>(IMvxViewModel <TParameter, TResult> viewModel, TParameter param, IMvxBundle presentationBundle = null)
            where TParameter : class
            where TResult : class
        {
            RunViewModelLifecycle(viewModel);
            var request = new MvxViewModelInstanceRequest(viewModel)
            {
                PresentationValues = presentationBundle?.SafeGetData()
            };

            var args = new NavigateEventArgs(viewModel);

            OnBeforeNavigate(this, args);

            var tcs = new TaskCompletionSource <TResult>();

            viewModel.SetClose(tcs);

            ViewDispatcher.ShowViewModel(request);
            await viewModel.Initialize(param);

            OnAfterNavigate(this, args);

            try
            {
                return(await tcs.Task);
            }
            catch
            {
                return(default(TResult));
            }
        }
コード例 #2
0
        protected void RunViewModelLifecycle <TParameter>(
            IMvxViewModel <TParameter> viewModel,
            TParameter param,
            IMvxBundle?parameterValues,
            IMvxBundle?savedState,
            IMvxNavigateEventArgs?navigationArgs)
            where TParameter : notnull
        {
            if (viewModel == null)
            {
                throw new ArgumentNullException(nameof(viewModel));
            }

            try
            {
                CallCustomInitMethods(viewModel, parameterValues);
                if (navigationArgs?.Cancel == true)
                {
                    return;
                }
                if (savedState != null)
                {
                    CallReloadStateMethods(viewModel, savedState);
                    if (navigationArgs?.Cancel == true)
                    {
                        return;
                    }
                }
                viewModel.Start();
                if (navigationArgs?.Cancel == true)
                {
                    return;
                }

                viewModel.Prepare();
                if (navigationArgs?.Cancel == true)
                {
                    return;
                }

                viewModel.Prepare(param);
                if (navigationArgs?.Cancel == true)
                {
                    return;
                }

                viewModel.InitializeTask = MvxNotifyTask.Create(() => viewModel.Initialize());
            }
            catch (Exception exception)
            {
                throw exception.MvxWrap("Problem running viewModel lifecycle of type {0}", viewModel.GetType().Name);
            }
        }
コード例 #3
0
        public virtual async Task Navigate <TParameter>(IMvxViewModel <TParameter> viewModel, TParameter param, IMvxBundle presentationBundle = null) where TParameter : class
        {
            RunViewModelLifecycle(viewModel);
            var request = new MvxViewModelInstanceRequest(viewModel)
            {
                PresentationValues = presentationBundle?.SafeGetData()
            };

            var args = new NavigateEventArgs(viewModel);

            OnBeforeNavigate(this, args);

            ViewDispatcher.ShowViewModel(request);
            await viewModel.Initialize(param);

            OnAfterNavigate(this, args);
        }
コード例 #4
0
        public virtual async Task <TResult> Navigate <TParameter, TResult> (MvxViewModelRequest request, IMvxViewModel viewModel, TParameter param, IMvxBundle presentationBundle = null, CancellationToken cancellationToken = default(CancellationToken)) where TParameter : class where TResult : class
        {
            var args = new NavigateEventArgs(viewModel);

            OnBeforeNavigate(this, args);

            var tcs = new TaskCompletionSource <TResult>();

            if (viewModel is IMvxViewModel <TParameter, TResult> vmParamResult)
            {
                vmParamResult.SetClose(tcs, cancellationToken);
                await vmParamResult.Initialize(param);
            }
            else if (viewModel is IMvxViewModelResult <TResult> vmResult)
            {
                vmResult.SetClose(tcs, cancellationToken);
            }
            else if (viewModel is IMvxViewModel <TParameter> vmParam)
            {
                await vmParam.Initialize(param);
            }

            await viewModel.Initialize();

            RunViewModelLifecycle(viewModel, new MvxBundle(request.ParameterValues));

            ViewDispatcher.ShowViewModel(request);
            OnAfterNavigate(this, args);

            if (viewModel is IMvxViewModel <TParameter, TResult> || viewModel is IMvxViewModelResult <TResult> )
            {
                try
                {
                    return(await tcs.Task);
                }
                catch (Exception e)
                {
                    return(default(TResult));
                }
            }
            else
            {
                return(default(TResult));
            }
        }
コード例 #5
0
        protected void RunViewModelLifecycle(IMvxViewModel viewModel, IMvxBundle parameterValues, IMvxBundle savedState)
        {
            try
            {
                CallCustomInitMethods(viewModel, parameterValues);
                if (savedState != null)
                {
                    CallReloadStateMethods(viewModel, savedState);
                }
                viewModel.Start();

                viewModel.Prepare();

                viewModel.InitializeTask = MvxNotifyTask.Create(() => viewModel.Initialize());
            }
            catch (Exception exception)
            {
                throw exception.MvxWrap("Problem running viewModel lifecycle of type {0}", viewModel.GetType().Name);
            }
        }