如何在基础内容页面中使用 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
方法上使用这种类型的实例。
我正在使用反应式内容页面库,但如何从基础视图模型访问某些内容?我必须使用实际基础视图模型的对象吗?
我试过类似的方法,但智能感知出于显而易见的原因对我咆哮。如何访问我添加到我所有视图模型扩展的基本 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
方法上使用这种类型的实例。