【发布时间】: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