using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
namespace Future.Contract
{
///
/// 用于将一个属性标记为一个可以使用参数设计器编辑的参数值
///
[DataContract]
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class ParameterDefineAttribute : Attribute, INotifyPropertyChanged, IFuture
{
public event PropertyChangedEventHandler PropertyChanged;
///
/// 参数的归类信息
///
[DataMember]
private EParameterKind mKind = EParameterKind.General;
public EParameterKind Kind
{
get => this.mKind;
set
{
if (this.mKind != value)
{
this.mKind = value;
this.PropertyChanged(this, new PropertyChangedEventArgs("Kind"));
}
}
}
///
/// 用于存储自定义参数设置器的类型
///
[DataMember]
private Type mSetterType = null;
///
/// 自定义参数设置器使用的类型定义
///
public Type SetterType
{
get => this.mSetterType;
set { this.mSetterType = value; }
}
///
/// 用于存储参数数据类型的内部变量
///
[DataMember]
private EParameterType mType = EParameterType.Number;
///
/// 参数的数据类型
///
public EParameterType Type
{
get => this.mType;
set
{
if (this.mType != value)
{
this.mType = value;
this.PropertyChanged(this, new PropertyChangedEventArgs("Type"));
}
}
}
///
/// 用于存储参数名称的内部变量
///
[DataMember]
private string mName = "PName";
///
/// 参数的标识名称
///
public string Name
{
get => this.mName;
set
{
if (this.mName != value)
{
this.mName = value;
this.PropertyChanged(this, new PropertyChangedEventArgs("Name"));
}
}
}
///
/// 用于存储参数标题名称的内部变量
///
[DataMember]
private string mTitle = "动态参数";
///
/// 参数的标题
///
public string Title
{
get => this.mTitle;
set
{
if (mTitle != value)
{
mTitle = value;
this.PropertyChanged(this, new PropertyChangedEventArgs("Title"));
}
}
}
///
/// 用于存储参数描述信息的内部变量
///
[DataMember]
private string mRemark = "动态参数";
///
/// 参数描述
///
public string Remark
{
get => this.mRemark;
set
{
if (mRemark != value)
{
mRemark = value;
this.PropertyChanged(this, new PropertyChangedEventArgs("Remark"));
}
}
}
///
/// 用于存储以文本格式记录的参数默认值的内部变量
///
[DataMember]
private string mDefault = "";
///
/// 以文本形式存储参数的默认取值或是可取值集合
///
public string Default
{
get => this.mDefault;
set
{
if (this.mDefault != value)
{
mDefault = value;
this.PropertyChanged(this, new PropertyChangedEventArgs("Default"));
}
}
}
///
/// 为设计器指示ValueExp是值还是引用
///
public bool IsLinked { get => (this.Expression?.StartsWith(FutureInstruct.PR_StartString)) ?? false; }
///
/// 用于存储值表达式的内部变量
///
[DataMember]
private string mExpression = "";
///
/// 参数引用表达式,设计器操作的永远是这个属性而非真正的参数值Value属性
///
public string Expression
{
get => this.mExpression;
set
{
if (this.mExpression != value)
{
this.mExpression = value;
this.PropertyChanged(this, new PropertyChangedEventArgs("ValueExp"));
this.PropertyChanged(this, new PropertyChangedEventArgs("IsLinked"));
}
}
}
///
/// 用于存储候选值的内部变量
///
[DataMember]
private string mCandidate = "";
///
/// 候选值:如果类型存在候选值则必须使用标准Json格式描述;可以是JsonObject格式或是JsonArray格式的任意一种描述方式
///
public string Candidate
{
get => this.mCandidate;
set
{
if (this.mCandidate != value)
{
this.Candidate = value;
this.PropertyChanged(this, new PropertyChangedEventArgs("Candidate"));
}
}
}
///
/// 候选词字典实例专为设计器使用
///
public Dictionary CandidateMapping
{
get
{
Dictionary dicCandidate = null;
if (!string.IsNullOrEmpty(this.Candidate))
{
try
{
//有可能是JsonArray定义的候选词集合
if (this.Candidate[0] == '[')
{
List