2017-09-26 20 views
1

「子」ビュー・モデルを作成して問題、それは特定の名前を使用しているのはなぜ私がプリズムのソースコードにこのプリズムXF:

Container.RegisterType<INavigationService, UnityPageNavigationService>(_navigationServiceName); 

を見ることができますか?

class ItemViewModel : BindableBase 
{ 
    public ItemViewModel(INavigationService navigationService) 
    { 
    } 
} 

と私はページ上の項目を作成しています:

class MainPageViewModel : BindableBase 
{ 
    public IEnumerable<ItemViewModel> Items { get; private set; } 

    public MainPageViewModel(Funct<ItemViewModel> itemFactory) 
    { 
    } 

    public void OnNavigatedTo(NavigationParameters parameters) { 
     Items = ... // Create items, where each item is created using itemFactory 
    } 
} 
私は子ビュー・モデルで苦労してるので、私は求めています

Container.RegisterType<INavigationService, UnityPageNavigationService>(); 

:これを持っていないのはなぜ

しかし、DIが失敗したことがItemViewModelを作成することはできませんので、それは例外をスロー:

Microsoft.Practices.Unity.ResolutionFailedException: の依存関係の解決に失敗しました。タイプ= "MyApp.ViewModels.ItemViewModel"、name = "(なし)" 中に例外が発生しました:解決中。 例外:InvalidOperationException - 現在の型Prism.Navigation.INavigationServiceがインタフェースであり、 を構築できません。

タイプマッピングがありません。

答えて

1

Xamarinのフォームナビゲーションは、ナビゲート元のページに基づいています。したがって、Prism Forms PageNavigationServiceは、そのサービスの特定のインスタンスに関連付けられているページを認識している必要があります。これを容易にするために、サービスを「秘密」キーで登録し、サービスを解決し、ViewModelが消費する名前付きインスタンス「navigationService」を使用してサービスを渡します。

絶対ナビゲーション(Application.MainPageをリセット)を実行している場合を除き、ViewModelのコンテキスト外でNavigationServiceを使用しないでください。

各DIコンテナはこれを少し違って扱いますが、それぞれがわずかなバリエーションの登録キーを使用しています。これらはすべて、Prismがオープンソースであると見なすのに十分簡単です。

+0

ありがとうございます!私は、ビューモデルの外でNavigationServiceを使用していません。 'ItemViewModel'はビューモデルです。これはあなたが参照している場合は、ページのビューモデルではありません。私のシナリオに対する解決策はありますか?私は自分のシナリオが特別だとは思わない。 –

+0

現在検討中です。しかし、Xamarinがビューの親ページを取得する方法を私たちに与えることができない限り、それをサポートするためにできることはありません。 –

+0

私の場合、それはビューとは関係ありません。私は、私が動作するためにnavigationServiceにDIが必要な子ビューモデルを作成しています。 –

関連する問題