代码之家  ›  专栏  ›  技术社区  ›  Drake

如何跳转到根

  •  0
  • Drake  · 技术社区  · 6 年前

    public class ViewPresenter : MvxWpfViewPresenter
    {
        ContentControl _contentControl;
    
        Type _currentViewModelType;
        IMvxViewModel _rootViewModel;
    
        public ViewPresenter(ContentControl c) : base(c)
        {
            _contentControl = c;
    
            AddPresentationHintHandler<SetRootHint>(SetRootHintHandler);
            AddPresentationHintHandler<PopToRootHint>(PopToRootHintHandler);
        }
    
        protected override void ShowContentView(FrameworkElement element, MvxContentPresentationAttribute attribute, MvxViewModelRequest request)
        {
            base.ShowContentView(element, attribute, request);
    
            _currentViewModelType = request.ViewModelType;
        }
    
        private bool SetRootHintHandler(SetRootHint hint)
        {
            _rootViewModel = hint.CurrentViewModel;
    
            return true;
        }
    
        private bool PopToRootHintHandler(PopToRootHint hint)
        {
            // How to pop all the way down to _rootViewModel ?
    
            return true;
        }
    }
    

    我怎么能一直跳到 _rootViewModel ? 有没有更好的方法一次弹出多个视图模型?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Drake    6 年前

    最后我编写了一个helper类,它保存了所有视图模型的引用,以及您设置为 Root . 然后我可以打电话给我的 PopToRoot 方法。

    public class NavigationStack
    {
        private readonly List<IMvxViewModel> _stack;
    
        public IMvxViewModel Root { get; set; }
    
        public NavigationStack()
        {
            _stack = new List<IMvxViewModel>();
        }
    
        public void AddToStack(IMvxViewModel viewModel)
        {
            _stack.Add(viewModel);
        }
    
        public async Task PopToRoot(IMvxNavigationService navigationService)
        {
            if (Root == null)
            {
                throw new Exception("Can not pop to root because Root is null.");
            }
            else
            {
                _stack.Reverse();
    
                foreach (var v in _stack)
                {
                    if (v != Root)
                    {
                        await navigationService.Close(v);
                    }
                    else
                    {
                        break;
                    }
                }
    
                _stack.Clear();
            }
        }
    }
    

    IMvxViewModel 在我的应用程序中,一个接一个地关闭它们…有人知道这段代码是否会导致框架中的任何问题吗?