Mvvmcross 片段

Mvvmcross fragments

我正在尝试使用 MVVMCross 实现我的导航抽屉,但我无法显示片段。 (这不是导航抽屉的问题,而是片段和 MVVMCross 的问题)。

这是我示例中的代码(在 MVVMCross 的 github 上找到),请参阅下面的 github 链接!

我有一个 activity 扩展 MvxCachingFragmentCompatActivity<MainViewModel>,这是包含 [=14= 的 MainActivity ](称为Resource.Id.content_frame

我有一个 MvxFragmentFirstFragment:

[MvxFragment(typeof(MainViewModel), Resource.Id.content_frame, true)]
[Register(nameof(FirstFragment))]
public class FirstFragment : MvxFragment<FirstViewModel>
{
    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        base.OnCreateView(inflater, container, savedInstanceState);
        var view = this.BindingInflate(Resource.Layout.FirstView, container, false);
        return view;
    }
}

我的 MainViewModel 中还添加了以下代码:

public class MainViewModel : MvxViewModel
{
    private readonly IMvxNavigationService _navigationService;

    public MainViewModel(IMvxNavigationService navigationService)
    {
        _navigationService = navigationService;
    }

    public override async Task Initialize()
    {
        await _navigationService.Navigate<FirstViewModel>();
    }
}

Github 链接:

我发现了问题 => 显然 MvxNavigationService 出于某种原因不喜欢 MvxCachingFragmentCompatActivity

第一个样品(工作)

first sample 中,我直接在从 MvxCachingFragmentCompatActivity 扩展的 MainViewModel 上执行 RegisterAppStart<>这很完美

一些代码示例 (for full code see link)

public class App : MvvmCross.Core.ViewModels.MvxApplication
{
    public override void Initialize()
    {
        RegisterAppStart<MainViewModel>();
    }
}

主视图模型:MvxViewModel

public MainViewModel(IMvxNavigationService navigationService)
{
    _navigationService = navigationService;
    Init();
}

public async void Init()
{
    await _navigationService.Navigate<FirstViewModel>();
}

第二个样本(问题)

second sample我先调用另一个activity(StartActivity)然后去MainActivity。这会产生 问题 因为 MainViewModel 不是 调用 RegisterAppStart<> 而是 IMvxNavigationService.Navigate<MainViewModel>()

一些代码示例 (for full code see link)

public class App : MvvmCross.Core.ViewModels.MvxApplication
{
    public override void Initialize()
    {
        RegisterAppStart<StartViewModel>();
    }
}

启动视图模型:

public class StartViewModel : MvxViewModel
{
    private readonly IMvxNavigationService _navigationService;

    public ICommand StartCommand => new MvxCommand(ExecuteStart);

    public StartViewModel()
    {
        _navigationService = Mvx.Resolve<IMvxNavigationService>();
    }

    private async void ExecuteStart()
    {
        await _navigationService.Navigate<MainViewModel>();
    }
}

区别:

  • 第一个视图模型:RegisterAppStart<StartViewModel>();
  • 从导航服务调用:await _navigationService.Navigate<MainViewModel>();