2017-08-29 24 views
0

"MvvmCross.Platform.Exceptions.MvxExceptionをスローする子ViewModelコンストラクタにパラメータを渡そうとしています。ViewModelを構築して初期化できませんでした... MvxIoCResolveException:パラメータの解決に失敗しました型がMyTypeのパラメータMYPARAM ...」私はViewModelにMVVMCROSS - ViewModelにパラメータを渡す

MyChildViewModel.cs私の親で

public class MyChildViewModel : MvxViewModel 
{ 
    private MyType _myParam; 
    public MyType MyParam 
    { 
     get { return _myParam; } 
     set 
     { 
      if (SetProperty(ref _myParam, value)) 
      { 
       RaisePropertyChanged(() => MyParam); 
      } 
     } 
    } 

    public MyChildViewModel(MyType myParam) 
    { 
     _myParam = myParam; 
    } 

} 

public ICommand ShowDialogCommand { get; private set; } 
ShowDialogCommand = new MvxCommand<MyType>(e => ShowViewModel<MyChildViewModel>(e)); 

親アクティビティの呼び出し:私は明らかに間違って何かをやっている

ViewModel.ShowDialogCommand.Execute(VarOfMyType); 

。これは、データを子ViewModelに渡すためにリモートで受け入れられるアプローチですか?ベストプラクティスは何ですか?

貴重な時間をいただきありがとうございます。

答えて

2

あなたはドキュメント をよく読んでいる場合には、MvxNavigationServiceでオブジェクトを渡すことは簡単です:https://www.mvvmcross.com/documentation/fundamentals/navigation

このドキュメントは現在、毎晩リリースされているMvvmCross 5.2のドキュメントですが、ほぼ同じことが5.0以降で動作することに注意してください。これはようになりますあなたのViewModelには

public class MyViewModel : MvxViewModel 
{ 
    private readonly IMvxNavigationService _navigationService; 
    public MyViewModel(IMvxNavigationService navigationService) 
    { 
     _navigationService = navigationService; 
    } 

    public override void Prepare() 
    { 
     //Do anything before navigating to the view 
    } 

    public async Task SomeMethod() 
    { 
     await _navigationService.Navigate<NextViewModel, MyObject>(new MyObject()); 
    } 
} 

public class NextViewModel : MvxViewModel<MyObject> 
{ 
    public override void Prepare(MyObject parameter) 
    { 
     //Do anything before navigating to the view 
     //Save the parameter to a property if you want to use it later 
    } 

    public override async Task Initialize() 
    { 
     //Do heavy work and data loading here 
    } 
} 
+0

@ Martijn00ありがとうございました。あなたは最高です、私はmvvmcrossが大好き!私は本当にv5.0.5です。あなたのIMvxNavigationServiceの例は、そのままの状態で動作しますか? 5.0と5.2の違いは何ですか? – Stack

+0

違いは 'void Prepare(MyObject parameter)'のオーバーライドです。 5.0ではこれは 'Task Initialize(MyObject parameter)'ですが、これを変更しました。 – Martijn00

+0

チャームのように働いた。どうもありがとうございました! (親)ViewModel - 'MvxAsyncCommand'を使用します:' SomeMethodCommand =新しいMvxAsyncCommand(SomeMethod); '親のViewModelを使用します。 – Stack

2

彼らはそれをやった方法は、(適応とあなたのケースのために変更)されthis websiteから:

public ICommand ShowDialogCommand { get; private set; } 
ShowDialogCommand = new MvxCommand<MyType>(ShowMyVM); 

private void ShowMyVM(MyType e) 
{ 
    if (e != null) 
     ShowViewModel<SingleClientViewModel>(e); 
    else 
    { 
     //handle case where your parameter is null 
    } 
} 
+0

はそれを試してみました。根本的な問題を解決するのではなく、ヌルチェックとあなたの時間+1を解決します。 – Stack

関連する問題