Xamarin.forms 如何使用反应式&x27;在基本内容页中激活时

Xamarin.forms 如何使用反应式&x27;在基本内容页中激活时,xamarin.forms,reactiveui,Xamarin.forms,Reactiveui,我使用的是反应式内容页面库,但如何从基本视图模型访问内容?是否必须使用实际基础viewmodel的对象 我试过类似的方法,但intellisense对我咆哮的原因很明显。如何访问添加到所有视图模型扩展的基本veiwmodel的a命令。基本视图模型称为“BaseViewModel” 还有,你可以。什么时候在你的内容页面和你的内容页面中被激活,或者这会把事情搞砸 public class ContentPageBase<TViewModel> : ReactiveContentPage

我使用的是反应式内容页面库,但如何从基本视图模型访问内容?是否必须使用实际基础viewmodel的对象

我试过类似的方法,但intellisense对我咆哮的原因很明显。如何访问添加到所有视图模型扩展的基本veiwmodel的a命令。基本视图模型称为“BaseViewModel”

还有,你可以。什么时候在你的内容页面和你的内容页面中被激活,或者这会把事情搞砸

 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是正确的类型。不要仅仅因为…它们存在的原因而使用接口,但如果您甚至从未计划创建新的实现,为什么还要麻烦呢?