2

Prism Unity アプリを作成し (prism 拡張パックから - 本当に素晴らしい)、2 つの新しいビューを追加し、ビュー間の基本的なナビゲーションをセットアップしました。これはすべて、問題なく正常に機能しました。

本当に欲しいのは、DryIoc を使用することです (会社のポリシー)。そこで、Unity パッケージ (Unity および Prism.Unity.Forms) を削除し、DryIoc パッケージ (DryIoc および Prism.DryIoc.Forms) をインストールしました。正しい名前空間 (xmlns:prism="clr-namespace:Prism.DryIoc;assembly=Prism.DryIoc.Forms") を使用するように App.xaml を修正し、Unity 参照ではなく DryIoc を使用するように他のすべての参照を修正しました。

これはすべて例外なくコンパイルおよび実行されます。しかし、デバッグすると、AutoWireup が期待どおりに機能しないことは明らかです (少なくとも私が期待するとおり)。ViewModel のコンストラクター (またはその他の場所) のブレークポイントはヒットせず、タイトル バインディングはプルスルーされません。

不足している構成/セットアップまたはリファレンスはありますか?

私のコード: 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";
    }
}

上記のように、AutoWireUp を True に設定して、PageName & PageNameViewModel の標準命名規則を使用します。

これはすべてUnityでうまく機能しましたが、DryIocで何かが欠けています...しかし、私を逃れるものは何ですか。

プロジェクト全体を検索しましたが、Unity の参照や痕跡は残っていません。

どんな助けでも大歓迎です。

4

1 に答える 1

1

やっとこれを見る時間ができました。ViewModel をコンテナーに明示的に登録すると、すべて正常に動作します。したがって、DryIoC コンテナーのルールが欠落しているか、DryIoC を使用するときに ViewModel を明示的に登録する必要があると推測しています。

于 2016-09-04T12:59:13.890 に答える