Mvvmcross 片段
Mvvmcross fragments
我正在尝试使用 MVVMCross 实现我的导航抽屉,但我无法显示片段。 (这不是导航抽屉的问题,而是片段和 MVVMCross 的问题)。
这是我示例中的代码(在 MVVMCross 的 github 上找到),请参阅下面的 github 链接!
我有一个 activity 扩展 MvxCachingFragmentCompatActivity<MainViewModel>
,这是包含 [=14= 的 MainActivity
](称为Resource.Id.content_frame
)
我有一个 MvxFragment
叫 FirstFragment
:
[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>();
我正在尝试使用 MVVMCross 实现我的导航抽屉,但我无法显示片段。 (这不是导航抽屉的问题,而是片段和 MVVMCross 的问题)。
这是我示例中的代码(在 MVVMCross 的 github 上找到),请参阅下面的 github 链接!
我有一个 activity 扩展 MvxCachingFragmentCompatActivity<MainViewModel>
,这是包含 [=14= 的 MainActivity
](称为Resource.Id.content_frame
)
我有一个 MvxFragment
叫 FirstFragment
:
[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>();