2017-08-29 94 views
0

我試圖將一個參數傳遞給引發「MvvmCross.Platform.Exceptions.MvxException:無法構造和初始化ViewModel的子ViewModel構造函數... MvxIoCResolveException:無法解析參數類型MyType的參數myParam ......」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; 
    } 

} 

在我父母的ViewModel我有:

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及更高版本而言幾乎相同。

在您的視圖模型,這可能是這樣的:

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.0和5.2之間有什麼區別? – Stack

+0

區別在於'void Prepare(MyObject parameter)'的覆蓋。在5.0這是'任務初始化(MyObject參數)',但我們改變了。 – Martijn00

+0

工作就像一個魅力。非常感謝你!兒童NextViewModel v5.0:'公共覆蓋任務初始化(MyObject參數)'和'返回Task.FromResult(false);'父ViewModel - 使用'MvxAsyncCommand':'SomeMethodCommand = new MvxAsyncCommand(SomeMethod);' – 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