2017-07-27 32 views
0

我正在用MvvmCross框架潛入Xamarain的世界。在我當前的項目中,我想使用MVVM基礎ViewModel,以便能夠在其他ViewModel中重用我的一些代碼。爲MvvmCross創建基本ViewModel的麻煩5.1.0

當試圖實現這一點時,我遇到了一個問題,當使用支持導航之間傳遞參數的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甚至告訴我,當我忘記時需要實現Initialize Task。

這種解決方案在任何情況下都不是很好。當我有不需要傳遞參數的ViewModel時,我仍然需要指定一個參數對象並實現Initialize方法。

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

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

當從本BaseViewModel我不會需要實現初始化方法,但後來我不會強迫來實現它,當我創建需要的參數路過一個視圖模型的抽象方法。

上述解決方案是可行的,但我很好奇,如果有人遇到這個相同的問題,也許有更好的解決方案?一種在兩種情況下都很好,無需設置兩個BaseViewModel類。

親切的問候,

Jop的Middelkamp

回答

1

這個文檔狀態:https://www.mvvmcross.com/documentation/fundamentals/navigation

如果你有BaseViewModel你可能不能夠繼承MvxViewModel<TParameter>MvxViewModel<TParameter, TResult>,因爲你已經有了BaseViewModel爲基類。在這種情況下,您可以實現以下接口:

IMvxViewModel<TParameter>IMvxViewModelResult<TResult>IMvxViewModel<TParameter, TResult>

如果您在使用TResult你可以在源代碼複製到您的視圖模型:

​​