2

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

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

这一切都编译并运行,没有任何例外。但是当我调试时,很明显 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>

应用程序.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 和 PageNameViewModel 的标准命名约定,并将 AutoWireUp 设置为 True。

这一切都适用于 Unity,但我在 DryIoc 中遗漏了一些东西......但什么让我逃脱了。

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

任何帮助深表感谢。

4

1 回答 1

1

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

于 2016-09-04T12:59:13.890 回答