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

问题描述 投票:1回答:1

为了使用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;
}
c# xamarin xamarin.forms autofac
1个回答
1
投票

Activator.CreateInstancean overload,它接受一个对象数组作为构造函数的参数。

private static Page GetPage(Type viewModelType, MenuViewModel menuViewModel)
{
    //...
    page.BindingContext = Activator.CreateInstance(viewModelType, new object[] { menuViewModel });
    //...
}
© www.soinside.com 2019 - 2024. All rights reserved.