2017-07-27 12 views
0

私は現在、MvvmCrossフレームワークでXamarainの世界に飛び込んでいます。私の現在のプロジェクトでは、他のViewModelで自分のコードの一部を再利用できるように、MVVMベースのViewModelを使用したいと考えています。MvvmCross 5.1.0のベースViewModelの作成に問題があります

これを実装しようとすると、ナビゲーション間でパラメータを渡すことをサポートするMvxViewModelを使用するときに問題が発生しました。

public abstract class BaseViewModel<TParameter> : MvxViewModel, IMvxViewModel<TParameter> where TParameter : class 
{ 
    protected readonly IMvxNavigationService _navigationService; 

    public BaseViewModel(IMvxNavigationService navigationService) 
    { 
     _navigationService = navigationService; 
    } 

    public new abstract Task Initialize(TParameter parameter); 

} 

このようにして、BaseViewModelを次のように使用することができます。

public class ExampleViewModel : BaseViewModel<ExampleParameters> 
{ 
    private ExampleParameters _parameter; 

    public ExampleViewModel(IMvxNavigationService navigationService) : base(navigationService) 
    { 
    } 

    public override Task Initialize(ExampleParameters parameter) 
    { 
     return Task.Run(() => { _parameter = parameter; }); 
    } 
} 

この状況では、これはかなり良い解決策だと思います。 ExampleViewModelは、私が忘れてしまったときに初期化タスクを実装する必要があると私に伝えます。

なお、このソリューションはあらゆる状況で優れているわけではありません。 ViewModelにパラメータを渡す必要がないときは、パラメータオブジェクトを指定してInitializeメソッドを実装する必要があります。

public class ParameterlessViewModel : BaseViewModel<object> 
{ 
    public ParameterlessViewModel(IMvxNavigationService navigationService) : base(navigationService) 
    { 
    } 

    public override Task Initialize(object parameter) 
    { 
     return Task.Run(() => { }); 
    } 
} 

私は文句を言わないInitializeメソッドを実装する必要がありますが、私はパラメータの受け渡しを必要とViewModelに作成していたとき、私はそれを実装することを強制されることはありませんBaseViewModelから抽象メソッドを取り除きます。

上記の解決策は実行可能ですが、誰もがこの同じ問題に遭遇し、おそらくより良い解決策を持っていれば私は不思議です。 2つのBaseViewModelクラスをセットアップすることなく、両方の状況で良好なもの。このためドキュメントは

敬具、

ヨップMiddelkamp

答えて

1

を述べている:https://www.mvvmcross.com/documentation/fundamentals/navigation

をあなたはBaseViewModelを持っている場合は、すでにBaseViewModelなどを持っているので、あなたがMvxViewModel<TParameter>MvxViewModel<TParameter, TResult>を継承することができない場合がありますベースクラス。

​​ を:あなたはちょうどあなたのviewmodelにソースコードをコピーすることができ TResult使う場合

IMvxViewModel<TParameter>IMvxViewModelResult<TResult>またはIMvxViewModel<TParameter, TResult>

:この場合は、次のインターフェイスを実装することができます

関連する問題