【问题标题】:How to use ReactiveUI with MvvmCross如何在 MvvmCross 中使用 ReactiveUI
【发布时间】:2021-03-15 22:57:22
【问题描述】:

我想在 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);
    }

这似乎有效。我可以使用 MvxViewController 并使用 MvvmCross 的绑定方法绑定到属性。

但由于 viewmodel 不再是 MvxViewModel 我不能使用 SetProperty。这可能没问题,但是我在使用这种方法时还会遇到其他问题吗?

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

【问题讨论】:

    标签: xamarin mvvmcross reactiveui


    【解决方案1】:

    值得查看 Rodney Littles II 的 Interoperability with ReactiveUI 文章。这篇文章非常擅长解释 ReactiveUI 的工作原理以及如何将 ReactiveUI 与其他 MVVM 框架结合起来。还有一个ReactiveUI.Interop 存储库,其中包含代码示例,包括与FreshMvvmPrismMvvmCross 的互操作性示例。另见ReactiveUI.Interop/src。有一个SetProperty&lt;T&gt; 方法可用(请参阅MvxReactiveViewModel.cs)。

    【讨论】:

    • 我真的认为这就是答案。但是在尝试之后,我似乎无法使用 ObservableAsPropertyHelper。事实上,Rodney 自己也说过,它看起来不像单独与 IReactiveObject 接口一起工作。 reactivex.slack.com/archives/C02AJB872/…
    • 是的,那么可能值得从SetProperty 切换到RaiseAndSetIfChanged 或在您的ReactiveMvxViewModel 中实现SetProperty 就像这样我猜github.com/RocketSurgeonsGuild/ReactiveUI.Interop/blob/master/… 但是可能值得等待那些人的其他答案谁使用 MvvmCross 和 ReactiveUI。
    • 我猜我们都更熟悉 MvvmCross 而不是 ReactiveUI。知道仅使用 IMvxViewModel 会失去什么吗?
    猜你喜欢
    • 2020-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    相关资源
    最近更新 更多