2017-05-19 9 views
0

複数のビューを1つのViewModelに関連付ける方法に関するガイダンスを探しています。私たちは、Xamarin.Forms Portable(VS.NET 2017)とCaliburn.MicroをMVVMフレームワークとして使用してアプリケーションを開発しています。Xamarin.Forms Caliburn.Micro - 複数のビューを1つのViewModelに関連付けます

  • ビューが表示されます/Views/DemoView.Xaml
  • としてのViewModelが表示されます/ViewModels/DemoViewModel.cs App.csで

として、DemoViewは、以下のラインを介して呼び出され、すべて正常に動作します:

  • DisplayRootView <(DemoView)>();

ここで問題となるのは、モバイルとタブレット用に異なるビューを読み込む必要があることです。次のように私は/ビューの下に新しいフォルダ構造を作成: - /Views/Demo/Mobile.xaml - /Views/Demo/Tablet.xaml

質問(条件に基づいて、関連するビューをロードする方法でありますDevice.Idiom)、上記の2つのビューをDemoViewModelと関連付ける方法が必要であることがわかっています。

これは、依然として/Views/DemoView.Xaml(それが既に/ViewModels/DemoViewModel.csに関連付けられていることを知っている)が仲介者として動作し、前述の条件に基づいて正しいビューを読み込むことを意味しますか? ?

私たちがロードしようとするビューは、他のViewModelをItemsコレクションに追加することで、DemoViewModel(Conductor.Collection.OneActiveを実装する)内の他のページをロードするタブ付きページです。

おかげで、 P.

答えて

2

あなたはセットアップにいくつかcustom conventionsを持つことになります。

常にに電話機とタブレット用に異なるビューをロードする必要がある場合は、タイプマッピングを設定してCaliburnがViewまたはViewModelsを検索する領域を構成できます。

App.xaml.cs

protected override void Configure() 
{ 
    TypeMappingConfiguration config = null; 
    if(Device.Idiom == TargetIdiom.Tablet) 
    { 
     config = new TypeMappingConfiguration 
     { 
      DefaultSubNamespaceForViews = "Tablet.Views", 
      DefaultSubNamespaceForViewModels = "Common.ViewModels" 
     }; 
    } 
    else 
    { 
     config = new TypeMappingConfiguration 
     { 
      DefaultSubNamespaceForViews = "Mobile.Views", 
      DefaultSubNamespaceForViewModels = "Common.ViewModels" 
     }; 
    } 
    if(config != null) 
    { 
     ViewLocator.ConfigureTypeMappings(config); 
    } 
} 

あなたはイディオム全体で最も見解を共有している場合、あなたは、特定のビューモデルのビューを指定することができ

protected override void Configure() 
{ 
    if(Device.Idiom == TargetIdiom.Tablet) 
    { 
     ViewLocator.AddNamespaceMapping("Common.ViewModels.Demo", "Tablet.Views"); 
    } 
    else 
    { 
     ViewLocator.AddNamespaceMapping("Common.ViewModels.Demo", "Mobile.Views"); 
    } 
} 

これは

をマッピングします

錠剤:Common.ViewModels.DemoViewModelTablet.Views.DemoView

モバイル:Common.ViewModels.DemoViewModel

Mobile.Views.DemoViewにそして、あなたは常にこれらのハイブリッドを行うことができます。

関連する問題