我试图让我的xamarin-forms + mvvmcross项目中的视图正确加载而没有运气。
项目结构细分:
项目:Shared.Core - 100%跨平台代码,视图模型,模型, 等。
项目:Shared.Mobile - Xamarin表单视图
项目:iOS - 使用共享视图
项目:Android - 使用共享视图
项目:UWP - 使用共享视图
项目:WPF - 使用WPF本机视图
我有一个使用mvvmcross的工作WPF项目,我正试图让移动设备从iOS开始。
iOS项目仅在视图和视图模型位于同一个程序集中时才加载视图。否则我得到了:
Foundation.MonoTouchException:抛出Objective-C异常。名称: NSInternalInconsistencyException原因:应用程序窗口是 期望在应用程序结束时有一个根视图控制器 发射
通过获取PCL Views文件夹并将其移动到iOS项目,可以从此示例项目中看到相同的内容。
https://github.com/MvvmCross/MvvmCross-Forms/tree/master/Samples/Example001XAML
我也试过以下无济于事:
Setup.cs
protected override IEnumerable<Assembly> GetViewModelAssemblies()
{
var result = base.GetViewModelAssemblies();
var assemblyList = result.ToList();
assemblyList.Add(typeof(FirstViewModel).Assembly);
return assemblyList.ToArray();
}
protected override IEnumerable<Assembly> GetViewAssemblies()
{
var result = base.GetViewAssemblies();
var assemblyList = result.ToList();
assemblyList.Add(typeof(FirstPage).Assembly);
return assemblyList.ToArray();
}
protected override void InitializeViewLookup()
{
base.InitializeViewLookup();
var vmLookup = new Dictionary<Type, Type> {
{typeof (FirstViewModel), typeof (FirstPage)},
{typeof (AboutViewModel), typeof (AboutPage)}
};
var container = Mvx.Resolve<IMvxViewsContainer>();
container.AddAll(vmLookup);
}
答案 0 :(得分:1)
我刚刚在Forms presenter核心中解决了这个问题,现在它可以运行了!您已在正确的轨道上覆盖GetViewsAssemblies
或InitializeViewLookup
。如果演示者已经正确实施,那么它应该如何工作。
无论如何,随着Pull Request的新变化,它的工作方式是:
覆盖GetViewsAssemblies
让InitializeViewLookup
在内部将视图映射到ViewModel,从找到的视图告诉MvvmCross查找它们。 Setup.cs
中的代码如下所示:
protected override IEnumerable<Assembly> GetViewAssemblies()
{
var result = base.GetViewAssemblies();
var assemblyList = result.ToList();
assemblyList.Add(typeof(FirstPage).Assembly);
return assemblyList;
}
其中FirstPage
是包含视图的程序集中的一个页面。
或者您可以在InitializeViewLookup中明确告诉MvvmCross如何将视图映射到ViewModel:
protected override void InitializeViewLookup()
{
base.InitializeViewLookup();
var vmLookup = new Dictionary<Type, Type> {
{typeof (FirstViewModel), typeof (FirstPage)}
};
var container = Mvx.Resolve<IMvxViewsContainer>();
container.AddAll(vmLookup);
}