Xamarin 如何将ReactiveUI与MvvmCross一起使用
我想在MvvmCross应用程序中使用部分ReactiveUI。我没有使用Xamarin.Forms 我已经基于ReactiveObject创建了一个ViewModel。虽然它看起来确实有效,但我担心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()
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会损失什么吗?