#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?