Как использовать ReactiveUI с MvvmCross

#xamarin #mvvmcross #reactiveui

#xamarin #mvvmcross #реактивныйи

Вопрос:

Я хотел бы использовать части ReactiveUI в приложении MvvmCross. Я не использую Xamarin.Формы.

Мне удалось создать ViewModel на основе ReactiveObject. Хотя это, похоже, работает, я беспокоюсь, что в 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 amp;amp; CloseCompletionSource != null amp;amp; !CloseCompletionSource.Task.IsCompleted amp;amp; !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 и то, как он обрабатывает навигацию, внедрение зависимостей и т. Д.

Ответ №1:

Стоит ознакомиться со статьей Родни Литтлза II о совместимости с ReactiveUI. Эта статья очень хорошо объясняет, как работает ReactiveUI и как комбинировать ReactiveUI с другими фреймворками MVVM. Существует также ReactiveUI.Репозиторий взаимодействия, содержащий примеры кода, включая примеры взаимодействия с FreshMvvm , Prism , и MvvmCross . См. Также ReactiveUI.Взаимодействие / src. Существует доступный SetProperty<T> метод (см. MvxReactiveViewModel.cs).

Комментарии:

1. Я действительно думал, что это будет ответом. Но, попробовав это, мне кажется, что я не могу использовать ObservableAsPropertyHelper. На самом деле, сам Родни сказал, что, похоже, это не работает только с интерфейсом IReactiveObject. reactivex.slack.com/archives/C02AJB872 /…

2. Да, тогда, вероятно, стоит переключиться с SetProperty более RaiseAndSetIfChanged или реализовать SetProperty в вашем ReactiveMvxViewModel , как это, я думаю github.com/RocketSurgeonsGuild/ReactiveUI . Interop / blob / master / … Но да, возможно, стоит подождать других ответов от тех, кто использует MvvmCross с ReactiveUI.

3. Я предполагаю, что мы оба больше знакомы с MvvmCross, чем с ReactiveUI. Есть идеи, что я потеряю, просто используя IMvxViewModel?