如何弹出根目录

时间:2018-08-13 14:12:35

标签: wpf mvvmcross

我正在用MvvmCross编写WPF应用程序。我有一个要使用的自定义视图展示器,因此可以一枪弹出多个视图模型。这是我的视图演示者:

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 个答案:

答案 0 :(得分:0)

我最终写了一个助手类,其中保留了所有视图模型以及您设置为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的引用,然后一个接一个地关闭它们……有人知道吗这段代码会在框架中引起任何问题吗?