Xamarin.forms 如何使用反应式&x27;在基本内容页中激活时
我使用的是反应式内容页面库,但如何从基本视图模型访问内容?是否必须使用实际基础viewmodel的对象 我试过类似的方法,但intellisense对我咆哮的原因很明显。如何访问添加到所有视图模型扩展的基本veiwmodel的a命令。基本视图模型称为“BaseViewModel” 还有,你可以。什么时候在你的内容页面和你的内容页面中被激活,或者这会把事情搞砸Xamarin.forms 如何使用反应式&x27;在基本内容页中激活时,xamarin.forms,reactiveui,Xamarin.forms,Reactiveui,我使用的是反应式内容页面库,但如何从基本视图模型访问内容?是否必须使用实际基础viewmodel的对象 我试过类似的方法,但intellisense对我咆哮的原因很明显。如何访问添加到所有视图模型扩展的基本veiwmodel的a命令。基本视图模型称为“BaseViewModel” 还有,你可以。什么时候在你的内容页面和你的内容页面中被激活,或者这会把事情搞砸 public class ContentPageBase<TViewModel> : ReactiveContentPage
public class ContentPageBase<TViewModel> : ReactiveContentPage<TViewModel>, IContentPageBase where TViewModel : class
{
protected IBindingTypeConverter bindingDoubleToIntConverter;
private Subject<Unit> clearMessageQueueSubject;
public ContentPageBase() : base()
{
clearMessageQueueSubject = new Subject<Unit>();
bindingDoubleToIntConverter = (IBindingTypeConverter)App.Container.Resolve<IDoubleToIntConverter>();
this
.WhenActivated(
disposables =>
{
// VS complains when I try to use TViewModel as first param
clearMessageQueueSubject.InvokeCommand(TViewModel, x => x.ClearMessageQueueCommand).DisposeWith(disposables);
});
}
public class ContentPageBase:ReactiveContentPage,IContentPageBase其中TViewModel:class
{
受保护的IBindingTypeConverter绑定DoubleToIntConverter;
私人主体;
public ContentPageBase():base()
{
clearMessageQueueSubject=新主题();
bindingDoubleToIntConverter=(IBindingTypeConverter)App.Container.Resolve();
这
.什么时候有动力(
一次性用品=>
{
//当我尝试使用TViewModel作为第一个参数时,VS会抱怨
clearMessageQueueSubject.InvokeCommand(TViewModel,x=>x.ClearMessageQueueCommand).DisposeWith(disposables);
});
}
根据迭戈·拉斐尔·苏扎的回答,我通过以下步骤实现了这一目标:
public class ContentPageBase<TViewModel> : ReactiveContentPage<TViewModel>, IContentPageBase where TViewModel : BaseViewModel
{
protected IBindingTypeConverter bindingDoubleToIntConverter;
public Subject<Unit> clearMessageQueueSubject;
//protected Settings setting;
public ContentPageBase() : base()
{
clearMessageQueueSubject = new Subject<Unit>();
bindingDoubleToIntConverter = (IBindingTypeConverter)App.Container.Resolve<IDoubleToIntConverter>();
this
.WhenActivated(
disposables =>
{
clearMessageQueueSubject.InvokeCommand(this.ViewModel, x => x.ClearMessageQueueCommand).DisposeWith(disposables);
});
}
public类ContentPageBase:ReactiveContentPage,IContentPageBase其中TViewModel:BaseViewModel
{
受保护的IBindingTypeConverter绑定DoubleToIntConverter;
公共主体;
//保护设置设置;
public ContentPageBase():base()
{
clearMessageQueueSubject=新主题();
bindingDoubleToIntConverter=(IBindingTypeConverter)App.Container.Resolve();
这
.什么时候有动力(
一次性用品=>
{
clearMessageQueueSubject.InvokeCommand(this.ViewModel,x=>x.ClearMessageQueueCommand).DisposeWith(disposables);
});
}
…另一个不一定推荐的选项:
public class ContentPageBase<TViewModel> : ReactiveContentPage<TViewModel>, IContentPageBase where TViewModel : class
{
protected IBindingTypeConverter bindingDoubleToIntConverter;
public Subject<Unit> clearMessageQueueSubject;
public ContentPageBase() : base()
{
clearMessageQueueSubject = new Subject<Unit>();
bindingDoubleToIntConverter = (IBindingTypeConverter)App.Container.Resolve<IDoubleToIntConverter>();
this
.WhenActivated(
disposables =>
{
clearMessageQueueSubject.InvokeCommand((IBaseViewModel)this.ViewModel, x => x.ClearMessageQueueCommand).DisposeWith(disposables);
});
}
public class ContentPageBase:ReactiveContentPage,IContentPageBase其中TViewModel:class
{
受保护的IBindingTypeConverter绑定DoubleToIntConverter;
公共主体;
public ContentPageBase():base()
{
clearMessageQueueSubject=新主题();
bindingDoubleToIntConverter=(IBindingTypeConverter)App.Container.Resolve();
这
.什么时候有动力(
一次性用品=>
{
clearMessageQueueSubject.InvokeCommand((IBaseViewModel)this.ViewModel,x=>x.ClearMessageQueueCommand).DisposeWith(disposables);
});
}
您的约束必须是其中TViewModel:BaseViewModel
,以便.Net编译器正确识别类型
也许你需要在
Invoke
方法上使用这种类型的实例。@diegrafaelsouza请将其作为答案发布,这样我可以给予信任。我会在你发布答案后解释。谢谢!在第二个示例中,如果TViewModel
没有实现IBaseViewModel
,你会得到ArgumentNullException
调用命令时。为什么不将该接口作为约束添加到TViewModel
(其中TViewModel:class,IBaseViewModel
)?@EugenePawlik我认为最好尽可能使用接口。这是错误的吗?对不起,如果它不实现IBaseViewModel
,你会得到一个InvalidCastException
。使用接口是好的,但第二个示例中的约束只说“用作泛型参数的类型必须是类”。它没有指定该类的任何外观…通过将该接口添加到类型参数的约束列表中,可以保证提供的任何类型都实现该接口。例如:public class ContentPageBase:ReactiveContentPage,IContentPageBase where TViewModel:class,IBaseViewModel
I不是老实说,确定为什么您甚至想强制转换到IBaseViewModel。只需通过指定约束确保您知道TViewModel是正确的类型。不要仅仅因为…它们存在的原因而使用接口,但如果您甚至从未计划创建新的实现,为什么还要麻烦呢?