为了使用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)
因此应用程序抛出错误
类型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社区提供的xamarin样本的应用程序,他们在其中使用了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;
}
发布于 2018-02-28 04:11:16
Activator.CreateInstance
具有接受对象数组作为构造函数参数的过载。
private static Page GetPage(Type viewModelType, MenuViewModel menuViewModel)
{
//...
page.BindingContext = Activator.CreateInstance(viewModelType, new object[] { menuViewModel });
//...
}
https://stackoverflow.com/questions/49024055
复制相似问题