如何解决System.NotSupportedException:“常量”类型的表达式不受支持您是否错过了表达式中的成员访问前缀?
我在基于 ReactiveUI 的 viewmodel 中收到以下异常...
System.NotSupportedException:不支持的类型表达式 '持续的'。您是否错过了表达式中的成员访问前缀?
错误发生在 ValidationEditorDocumentviewmodel 的构造函数中,在一个可观察的管道中,该管道旨在监视另一个 Reactive viewmodel (SelectedValidatorClientviewmodel) 中的属性 (SelectedValidatorClientviewmodel) 的变化>ValidationEditorviewmodel).
我想要做的是,只要 ValidationEditorviewmodel.SelectedValidatorClientviewmodel 属性发生变化,然后在另一个 viewmodel (RuleEditorviewmodel) 上设置 SelectedValidator。
using NextWare.ProductPortalUI.RXviewmodels.RXviewmodels.ValidationEditor;
using ReactiveUI;
using System;
namespace NextWare.ProductPortalUI.RXviewmodels.ValidationEditor
{
public sealed partial class ValidationEditorDocumentviewmodel: ReactiveObject
{
private ValidatorEditorviewmodel _validationEditorviewmodel;
private RuleEditorviewmodel _ruleEditorviewmodel;
public ValidationEditorDocumentviewmodel()
{
var setValidatorRuleSet = this.WhenAnyValue(x => ValidationEditorviewmodel.SelectedValidatorClientviewmodel)
.Subscribe(_ => SetValidatorOnRuleSet());
}
private void SetValidatorOnRuleSet()
{
if(RuleEditorviewmodel != null)
{
RuleEditorviewmodel.SelectedValidator = _validationEditorviewmodel.SelectedValidatorClientviewmodel.Validator;
}
}
public ValidatorEditorviewmodel ValidationEditorviewmodel
{
get => _validationEditorviewmodel;
set => this.RaiseAndSetIfChanged(ref _validationEditorviewmodel,value,nameof(ValidationEditorviewmodel));
}
}
}
这是引用的viewmodel ...
using NextWare.Domain.ValidationServices.Validator.Clientviewmodels;
using NextWare.ProductPortalUI.SharedComponents.DomainMetaExplorer.Models;
using ReactiveUI;
using Splat;
using System;
namespace NextWare.ProductPortalUI.RXviewmodels.RXviewmodels.ValidationEditor
{
public sealed partial class ValidatorEditorviewmodel : ReactiveObject
{
private ValidatorsClientviewmodel _validatorsClientviewmodel; // Contructor Injected Domain-based viewmodel
private ValidatorClientviewmodel _selectedValidatorClientviewmodel;
private Guid _selectedDomainElementModelReferenceId = Guid.NewGuid();
private TreeNode _selectedMetaExplorerTreeNode;
public ValidatorEditorviewmodel(ValidatorsClientviewmodel validatorsClientviewmodel = null)
{
_validatorsClientviewmodel = validatorsClientviewmodel ?? Locator.Current.GetService<ValidatorsClientviewmodel>();
this.WhenAnyValue(x => x.SelectedValidatorClientviewmodel)
.Subscribe(_ => SetValidator());
this.WhenAnyValue(x => x.SelectedMetaExplorerTreeNode) // Happens only once at startup
.Subscribe(_ => SetValidator());
}
private void SetValidator()
{
if(SelectedValidatorClientviewmodel != null && SelectedMetaExplorerTreeNode != null)
{
SelectedValidatorClientviewmodel.Validator.DomainElementName = SelectedMetaExplorerTreeNode.ModelMetaData.Name;
SelectedValidatorClientviewmodel.Validator.DomainElementNameSpace = SelectedMetaExplorerTreeNode.ModelMetaData.FqviewmodelName;
SelectedValidatorClientviewmodel.Validator.DomainElementModelReferenceId = SelectedMetaExplorerTreeNode.ModelMetaData.ModelReferenceId;
SelectedValidatorClientviewmodel.Validator.AggregateRootModelReferenceId = SelectedMetaExplorerTreeNode.ParentModelMetaData.ModelReferenceId;
}
}
public ValidatorsClientviewmodel ValidatorsClientviewmodel
{
get => _validatorsClientviewmodel;
private set => this.RaiseAndSetIfChanged(ref _validatorsClientviewmodel,nameof(ValidatorsClientviewmodel));
}
public ValidatorClientviewmodel SelectedValidatorClientviewmodel
{
get => _selectedValidatorClientviewmodel;
set => this.RaiseAndSetIfChanged(ref _selectedValidatorClientviewmodel,nameof(SelectedValidatorClientviewmodel));
}
public TreeNode SelectedMetaExplorerTreeNode
{
get => _selectedMetaExplorerTreeNode;
set => this.RaiseAndSetIfChanged(ref _selectedMetaExplorerTreeNode,nameof(SelectedMetaExplorerTreeNode));
}
}
}
从文档中,WhenAnyValue 从 IObservableChanged
我很困惑为什么会抛出这个异常。
解决方法
正如 Anthony 在评论中提到的
改变
var setValidatorRuleSet = this.WhenAnyValue(x => ValidationEditorViewModel.SelectedValidatorClientViewModel)
.Subscribe(_ => SetValidatorOnRuleSet());
到
var setValidatorRuleSet = this.WhenAnyValue(x => x.ValidationEditorViewModel.SelectedValidatorClientViewModel)
.Subscribe(_ => SetValidatorOnRuleSet());
在 x
之前加上额外的 ValidationEditorViewModel
。
WhenAnyValue 依赖于您拥有从“x”到您的财产的 lambda。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。