如何在基础内容页面中使用 Reactive 的 WhenActivated

How to use Reactive's WhenActivated in a base Content Page

我正在使用反应式内容页面库,但如何从基础视图模型访问某些内容?我必须使用实际基础视图模型的对象吗?

我试过类似的方法,但智能感知出于显而易见的原因对我咆哮。如何访问我添加到我所有视图模型扩展的基本 veiwmodel 中的命令。基本视图模型称为 "BaseViewModel".

此外,您能否在您的 ContentPageBase 以及您的内容页面中使用 .WhenActivated,或者这会不会搞砸了?

 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);
                });
    }

根据 Diego Rafael Souza 的回答,我通过执行以下操作使其正常工作:

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 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);
                });
    }

您的约束必须 where TViewModel : BaseViewModel 以便 .Net 编译器正确识别类型。

也许您需要在 Invoke 方法上使用这种类型的实例。