2017-11-30 5 views
0

私は、ViewからどのViewModelをナビゲートする必要があるかを設定できる方法を見つけようとしています。これは、コアプロジェクトを変更せずにナビゲーションフローを変更できるようにするためです。動的ViewModelのナビゲーション

ターゲットのViewModelをそこに設定し、インタフェースをViewModelに注入してナビゲーションを実行する方が簡単な方法だと思いました。

public interface IModelMapping 
{ 
    MvxViewModel ViewModelToNavigate(); 
} 

public class MyViewModel : MvxViewModel 
{ 

    readonly IMvxNavigationService navigationService; 
    readonly IModelMapping modelMapping; 

    public MyViewModel(IMvxNavigationService navigationService, IModelMapping modelMapping) 
    { 
     this.navigationService = navigationService; 
     this.modelMapping = modelMapping; 
    } 

    public IMvxAsyncCommand GoContent 
    { 
     get 
     { 
      IMvxViewModel vm = modelMapping.ViewModelToNavigate(); 
      IMvxAsyncCommand navigateCommand = new MvxAsyncCommand(() => navigationService.Navigate<vm>()); 

      return navigteCommand; 
     } 
    } 
} 

このコードの問題は、navigationService.Navigate()を設定する際にエラーが発生しています。エラーは 'vmは変数ですが型のように使用されます'

+1

何ファサードと一緒にURIのナビゲーションを使用してはどうですか? も参照してくださいhttps://www.mvvmcross.com/documentation/fundamentals/navigation#uri-navigation – Martijn00

+0

@ Martijn00 URIナビゲーションでソートし、アセンブリでViewModel IDを設定し、そのIDをビューからのインターフェイスに送信するViewModel – malaka

答えて

0

ファサードと一緒にURIナビゲーションを使用するとどうなりますか?また、https://www.mvvmcross.com/documentation/fundamentals/navigation#uri-navigation

あなたがタスクappをビルドしていると、別のビューを表示したいタスクのタイプに応じているとします。これはNavigationFacadesが便利なところです(正規表現があまりにも多くあります)。

mvx://task/?id=00 <– this task is done, show read-only view (ViewModelA)

mvx://task/?id=01 <– this task isn’t, go straight to edit view (ViewModelB)

[assembly: MvxRouting(typeof(SimpleNavigationFacade), @"mvx://task/\?id=(?<id>[A-Z0-9]{32})$")] 
namespace *.NavigationFacades 
{ 
    public class SimpleNavigationFacade 
     : IMvxNavigationFacade 
    { 
     public Task<MvxViewModelRequest> BuildViewModelRequest(string url, 
      IDictionary<string, string> currentParameters, MvxRequestedBy requestedBy) 
     { 
      // you can load data from a database etc. 
      // try not to do a lot of work here, as the user is waiting for the UI to do something ;) 
      var viewModelType = currentParameters["id"] == Guid.Empty.ToString("N") ? typeof(ViewModelA) : typeof(ViewModelB); 

      return Task.FromResult(new MvxViewModelRequest(viewModelType, new MvxBundle(), null, requestedBy)); 
     } 
    } 
} 
関連する問題