我正在用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
?有一种更好的方法可以一次弹出多个视图模型吗?
答案 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
的引用,然后一个接一个地关闭它们……有人知道吗这段代码会在框架中引起任何问题吗?