首页 文章

无法为MvvmCross 5.1.0创建基本ViewModel

提问于
浏览
0

我目前正在使用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

1 回答

  • 1

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

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

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

    如果您使用 TResult ,您只需将源代码复制到您的viewmodel中:

    public override TaskCompletionSource<object> CloseCompletionSource { get; set; }
    
    public override void ViewDestroy()
    {
        if (CloseCompletionSource != null && !CloseCompletionSource.Task.IsCompleted && !CloseCompletionSource.Task.IsFaulted)
            CloseCompletionSource?.TrySetCanceled();
        base.ViewDestroy();
    }
    

相关问题