无法为MvvmCross 5.1.0创建基本ViewModel

时间:2017-07-27 15:24:28

标签: mvvmcross

我目前正在使用MvvmCross框架潜入Xamarain的世界。在我目前的项目中,我想利用MVVM基础ViewModel来重用其他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甚至告诉我,当我忘记时,我需要实现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中删除抽象方法时,我不需要实现Initialize方法,但是当我创建需要传递参数的ViewModel时,我不会被迫实现它。

上述解决方案是可行的,但我很好奇是否有人遇到同样的问题并且可能有更好的解决方案?一种在两种情况下都很好,而不必设置两个BaseViewModel类。

亲切的问候,

Jop Middelkamp

2 个答案:

答案 0 :(得分:1)

此状态的文档:https://www.mvvmcross.com/documentation/fundamentals/navigation

如果您有http://127.0.0.1:8000,则可能无法继承BaseViewModelMvxViewModel<TParameter>,因为您已将MvxViewModel<TParameter, TResult>作为基类。在这种情况下,您可以实现以下界面:

BaseViewModelIMvxViewModel<TParameter>IMvxViewModelResult<TResult>

如果您使用IMvxViewModel<TParameter, TResult>,只需将源代码复制到viewmodel中即可:

TResult

答案 1 :(得分:0)

我们是否在基类或设备类中添加接口IMvxViewModel,能否举一个简单的例子

In this case you can implement the following interface:

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