Xamarin 如何将ReactiveUI与MvvmCross一起使用

Xamarin 如何将ReactiveUI与MvvmCross一起使用,xamarin,mvvmcross,reactiveui,Xamarin,Mvvmcross,Reactiveui,我想在MvvmCross应用程序中使用部分ReactiveUI。我没有使用Xamarin.Forms 我已经基于ReactiveObject创建了一个ViewModel。虽然它看起来确实有效,但我担心MvvmCross可能会产生我不理解的后果 public abstract class ReactiveMvxViewModel : ReactiveObject, IMvxViewModel { protected ReactiveMvxViewModel()

我想在MvvmCross应用程序中使用部分ReactiveUI。我没有使用Xamarin.Forms

我已经基于ReactiveObject创建了一个ViewModel。虽然它看起来确实有效,但我担心MvvmCross可能会产生我不理解的后果

public abstract class ReactiveMvxViewModel : ReactiveObject, IMvxViewModel
    {
        protected ReactiveMvxViewModel()
        {

        }
        
        public virtual void ViewCreated()
        {
        }

        public virtual void ViewAppearing()
        {
        }

        public virtual void ViewAppeared()
        {
        }

        public virtual void ViewDisappearing()
        {
        }

        public virtual void ViewDisappeared()
        {
        }

        public virtual void ViewDestroy(bool viewFinishing = true)
        {
        }

        public void Init(IMvxBundle parameters)
        {
            InitFromBundle(parameters);
        }

        public void ReloadState(IMvxBundle state)
        {
            ReloadFromBundle(state);
        }

        public virtual void Start()
        {
        }

        public void SaveState(IMvxBundle state)
        {
            SaveStateToBundle(state);
        }

        protected virtual void InitFromBundle(IMvxBundle parameters)
        {
        }

        protected virtual void ReloadFromBundle(IMvxBundle state)
        {
        }

        protected virtual void SaveStateToBundle(IMvxBundle bundle)
        {
        }

        public virtual void Prepare()
        {
        }

        public virtual Task Initialize()
        {
            return Task.FromResult(true);
        }

        private MvxNotifyTask _initializeTask;
        public MvxNotifyTask InitializeTask
        {
            get => _initializeTask;
            set => this.RaiseAndSetIfChanged(ref _initializeTask, value);
        }

        public ViewModelActivator Activator { get; }
    }
    
    public abstract class ReactiveMvxViewModel<TParameter> : ReactiveMvxViewModel, IMvxViewModel<TParameter>
        where TParameter : notnull
    {
        public abstract void Prepare(TParameter parameter);
    }

    //TODO: Not possible to name MvxViewModel, name is MvxViewModelResult for now
    public abstract class ReactiveMvxViewModelResult<TResult> : ReactiveMvxViewModel, IMvxViewModelResult<TResult>
        where TResult : notnull
    {
        public TaskCompletionSource<object> CloseCompletionSource { get; set; }

        public override void ViewDestroy(bool viewFinishing = true)
        {
            if (viewFinishing && CloseCompletionSource != null && !CloseCompletionSource.Task.IsCompleted && !CloseCompletionSource.Task.IsFaulted)
                CloseCompletionSource?.TrySetCanceled();

            base.ViewDestroy(viewFinishing);
        }
    }

    public abstract class ReactiveMvxViewModel<TParameter, TResult> : ReactiveMvxViewModelResult<TResult>, IMvxViewModel<TParameter, TResult>
        where TParameter : notnull
        where TResult : notnull
    {
        public abstract void Prepare(TParameter parameter);
    }
公共抽象类ReactiveMvxViewModel:ReactiveObject,IMvxViewModel
{
受保护的反应MVXViewModel()
{
}
创建的公共虚拟void ViewCreated()
{
}
公共虚拟void viewsing()
{
}
公共虚拟void视图()已出现
{
}
公共虚拟void view0()
{
}
公共虚拟空间视图()已消失
{
}
公共虚拟void ViewDestroy(bool viewFinishing=true)
{
}
public void Init(IMvxBundle参数)
{
InitFromBundle(参数);
}
公共无效重新加载状态(IMvxBundle状态)
{
从bundle(状态)重新加载;
}
公共虚拟void Start()
{
}
公共无效保存状态(IMvxBundle状态)
{
SaveStateToBundle(州);
}
受保护的虚拟void InitFromBundle(IMvxBundle参数)
{
}
受保护的虚拟void重新加载FromBundle(IMvxBundle状态)
{
}
受保护的虚拟void存储状态绑定(IMvxBundle)
{
}
公共虚拟空准备()
{
}
公共虚拟任务初始化()
{
返回Task.FromResult(true);
}
私有MvxNotifyTask_初始化任务;
公共MvxNotifyTask初始化任务
{
get=>_初始化任务;
set=>this.RaiseAndSetIfChanged(ref\u initializeTask,value);
}
公共ViewModelActivator激活器{get;}
}
公共抽象类ReactiveMvxViewModel:ReactiveMvxViewModel,IMvxViewModel
其中t参数:notnull
{
公共摘要无效准备(t参数参数);
}
//TODO:无法命名MvxViewModel,目前名称为MvxViewModelResult
公共抽象类ReactiveMvxViewModelResult:ReactiveMvxViewModel,IMvxViewModelResult
其中TResult:notnull
{
公共任务CompletionSource CloseCompletionSource{get;set;}
公共覆盖无效视图销毁(bool viewFinishing=true)
{
if(viewFinishing&&CloseCompletionSource!=null&&!CloseCompletionSource.Task.IsCompleted&&!CloseCompletionSource.Task.IsFaulted)
CloseCompletionSource?.TrySetCanceled();
基本视图销毁(视图整理);
}
}
公共抽象类ReactiveMvxViewModel:ReactiveMvxViewModelResult,IMvxViewModel
其中t参数:notnull
其中TResult:notnull
{
公共摘要无效准备(t参数参数);
}
这似乎奏效了。我能够使用MvxViewController并使用MvvmCross的绑定方法绑定到属性

但是因为viewmodel不再是MvxViewModel,所以我不能使用SetProperty。这可能是好的,但在接下来的过程中,我还会遇到其他问题吗


我喜欢MvvmCross以及它如何处理导航、依赖注入等问题。

值得一看Rodney Littles II的文章。本文非常擅长解释ReactiveUI是如何工作的,以及如何将ReactiveUI与其他MVVM框架相结合。还有一个包含代码示例的存储库,包括与
FreshMvvm
Prism
MvvmCross
的互操作性示例。另见。有一个
SetProperty
方法可用(请参阅)。

我真的认为这就是答案。但在尝试之后,我似乎无法使用ObservalEasyPropertyHelper。事实上,Rodney自己也说过,它看起来并不是单独与IReactiveObject接口一起工作的。是的,然后可能值得从
SetProperty
切换到
RaiseAndSetIfChanged
,或者在
ReactiveMvxViewModel
中实现
SetProperty
,就像这样,我想,但是可能值得等待那些将MvvmCross与ReactiveUI一起使用的人的其他答案。我猜我们都更熟悉MvvmCross比ReactiveUI更重要。你知道仅仅使用IMvxViewModel会损失什么吗?