PrismDryIoc.Forms AutowireViewModel无法正常工作

时间:2016-08-23 14:02:59

标签: xamarin prism dryioc

我创建了一个Prism Unity App(来自prism扩展包 - 非常好),添加了2个新视图并在视图之间设置了基本导航。这一切都很好,没有任何打嗝。

我真正想要的是使用DryIoc(公司政策)。所以我继续删除Unity包(Unity和Prism.Unity.Forms)并安装了DryIoc包(DryIoc和Prism.DryIoc.Forms)。修复App.xaml使用正确的命名空间(xmlns:prism =" clr-namespace:Prism.DryIoc; assembly = Prism.DryIoc.Forms")并修复所有其他引用以使用DryIoc而不是Unity References。

这一切都编译并运行,没有任何例外。但是当我调试时,很明显AutoWireup无法按预期工作(至少我预期如此)。 ViewModel的构造函数(或任何其他位置)中的断点未被命中,并且Title绑定不会通过。

我缺少配置/设置或参考吗?

我的代码: App.xaml中:

<?xml version="1.0" encoding="utf-8" ?><prism:PrismApplication xmlns="http://xamarin.com/schemas/2014/forms"
                    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                    xmlns:prism="clr-namespace:Prism.DryIoc;assembly=Prism.DryIoc.Forms"
                    x:Class="XamFormsPrism.App"></prism:PrismApplication>

App.xaml.cs:

public partial class App : Prism.DryIoc.PrismApplication
{
    public App(IPlatformInitializer initializer = null) : base(initializer) { }

    protected override void ConfigureContainer()
    {
        base.ConfigureContainer();            

    }
    protected override void OnInitialized()
    {
        this.InitializeComponent();

        this.NavigationService.NavigateAsync(NavigationLinks.MainPage);
    }

    protected override void RegisterTypes()
    {
        this.Container.RegisterTypeForNavigation<MainPage>();
        this.Container.RegisterTypeForNavigation<ViewA>();
        this.Container.RegisterTypeForNavigation<ViewB>();
    }
}

MainPage.xaml中:

<?xml version="1.0" encoding="utf-8" ?><ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
         prism:ViewModelLocator.AutowireViewModel="True"
         x:Class="XamFormsPrism.Views.MainPage"
         Title="MainPage"><StackLayout HorizontalOptions="Center" VerticalOptions="Center">
<Label Text="{Binding Title}" />
<Button Text="{Binding NavigateText}" Command="{Binding NavigateCommand}" /> </StackLayout></ContentPage>

MainPageViewModel.cs:

public class MainPageViewModel : BindableBase, INavigationAware
{
    private INavigationService navigationService = null;

    private string _title = "Jose Cuervo";
    public string Title
    {
        get { return _title; }
        set { SetProperty(ref _title, value); }
    }

    public DelegateCommand NavigateCommand { get; private set; }

    public MainPageViewModel(INavigationService navigationService)
    {
        this.navigationService = navigationService;
        this.NavigateCommand = new DelegateCommand(this.navigate, this.canNavigate);
    }

    private void navigate()
    {
        this.navigationService.NavigateAsync("ViewA");
    }

    private bool canNavigate()
    {
        return true;
    }

    public void OnNavigatedFrom(NavigationParameters parameters)
    {

    }

    public void OnNavigatedTo(NavigationParameters parameters)
    {
        if (parameters.ContainsKey("title"))
            Title = (string)parameters["title"] + " and Prism";
    }
}

如上所示,我使用PageName&amp; amp;的标准命名约定。 PageNameViewModel,AutoWireUp设置为True。

这一切都适用于Unity,但我在DryIoc中遗漏了一些东西......但是让我感到惊讶的是什么。

我搜索了整个项目,Unity没有任何参考或痕迹。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

我终于有时间再看看这个。如果我在容器中显式注册ViewModels,一切正常。因此,我猜测DryIoC容器中缺少规则,或者在使用DryIoC时,您必须明确注册ViewModel。