使用参数动态创建视图模型而不使用autofac

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用参数动态创建视图模型而不使用autofac相关的知识,希望对你有一定的参考价值。

为了使用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.CreateInstancean overload,它接受一个对象数组作为构造函数的参数。

private static Page GetPage(Type viewModelType, MenuViewModel menuViewModel)
{
    //...
    page.BindingContext = Activator.CreateInstance(viewModelType, new object[] { menuViewModel });
    //...
}

以上是关于使用参数动态创建视图模型而不使用autofac的主要内容,如果未能解决你的问题,请参考以下文章

AutoFac DbContext 问题 - 在创建模型时无法使用

使用Autofac动态注入启动Api服务

如何修复局部视图的视图模型

Aspnetcore2.0中Entityframeworkcore及Autofac的使用(附Demo)(

创建 CRUD 视图而不创建控制器

如何动态加载Autofac配置进行初始化