为了使用MVVM在Xamarin中创建导航服务,在下面的代码GetPage
函数中,我试图在Xamarin
中动态创建页面对象,之后我创建该页面的模型视图并将新创建的模型视图分配给页面的绑定上下文。
private static Page GetPage(Type viewModelType)
{
try
{
var pageType = viewModelType.Name.Replace("ViewModel", "Page");
Page page = (Page)Activator.CreateInstance(Type.GetType($"SEMA.View.{pageType}"));
page.BindingContext = Activator.CreateInstance(viewModelType);
if (page.BindingContext == null)
{
Debug.WriteLine("Binding Context is null");
}
return page;
}
catch (Exception e)
{
Debug.WriteLine(e.StackTrace);
}
return null;
}
但是这个代码的问题是我的模型视图中有参数,见下文。 MainViewModel(MenuViewModel menuViewModel)
因此app投掷错误
找不到类型为SEMA.ViewModel.MainViewModel的默认构造函数
如果我写默认构造函数,那么我的参数构造函数即MainViewModel(MenuViewModel menuViewModel)
将不会被调用。
public class MainViewModel : ViewModelBase
{
private MenuViewModel _menuViewModel;
public MainViewModel(MenuViewModel menuViewModel)
{
_menuViewModel = menuViewModel;
}
public MenuViewModel MenuViewModel
{
get
{
return _menuViewModel;
}
set
{
_menuViewModel = value;
OnPropertyChanged();
}
}
}
主页的xaml文件
<?xml version="1.0" encoding="UTF-8"?>
<MasterDetailPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:SEMA="clr-namespace:SEMA;assembly=SEMA"
xmlns:pages="clr-namespace:SEMA.View"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="SEMA.View.MainPage" >
<MasterDetailPage.Master>
<pages:MenuPage BindingContext="{Binding MenuViewModel}" />
</MasterDetailPage.Master>
<MasterDetailPage.Detail>
<ContentPage BackgroundColor="Transparent" />
</MasterDetailPage.Detail>
</MasterDetailPage>
我正在尝试基于xamarin sample provided by xamarin community创建应用程序在哪里使用autofac
并且他们使用以下代码创建页面并使用视图模型映射它,但我不想使用autofac因此我使用Activator page.BindingContext = Activator.CreateInstance(viewModelType);
创建视图模型而不是使用ViewModelBase viewModel = Locator.Instance.Resolve(viewModelType) as ViewModelBase;
page.BindingContext = viewModel;
protected Page CreateAndBindPage(Type viewModelType, object parameter)
{
Type pageType = GetPageTypeForViewModel(viewModelType);
if (pageType == null)
{
throw new Exception($"Mapping type for {viewModelType} is not a page");
}
Page page = Activator.CreateInstance(pageType) as Page;
ViewModelBase viewModel = Locator.Instance.Resolve(viewModelType) as ViewModelBase;
page.BindingContext = viewModel;
return page;
}
Activator.CreateInstance
有an overload,它接受一个对象数组作为构造函数的参数。
private static Page GetPage(Type viewModelType, MenuViewModel menuViewModel)
{
//...
page.BindingContext = Activator.CreateInstance(viewModelType, new object[] { menuViewModel });
//...
}