internal void RemoveProperty(AppOptionProperty property)
		{
			if (Declaration is AppOptionDeclaration)
			{
				(Declaration as AppOptionDeclaration)
					.RemoveProperty(property);
			}
		}
		private void ResetProperty(FolderItemType type)
		{
			_UserProperties.Remove(OutputPathProperty);

			var propId = OutputPathProperty?.PropertyId ?? GenerateNextPropertyId();

			switch (type)
			{
				case FolderItemType.File:
					OutputPathProperty = new FileOutputAppOptionProperty(propId, Name);
					break;
				case FolderItemType.Folder:
					OutputPathProperty = new FolderOutputAppOptionProperty(propId, Name);
					break;
				default:
					break;
			}

			_UserProperties.Add(OutputPathProperty);

			OptionTextPattern = ToPatternText(OutputPathProperty);
		}
		protected override bool CanRemoveProperty(AppOptionProperty property)
		{
			return false == property is FolderOutputAppOptionProperty;
		}
		public override void Rollback(AppOptionDeclarationBase other)
		{
			base.Rollback(other);

			OutputPathProperty = UserProperties[0];
		}
		public void OnDeserialized(StreamingContext context)
		{
			if (_UserProperties.Count > 0)
			{
				OutputPathProperty = _UserProperties[0];
			}
		}
		public bool RemoveProperty(AppOptionProperty property)
		{
			if (CanRemoveProperty(property))
			{
				return _UserProperties.Remove(property);
			}
			else
			{
				return false;
			}
		}
		protected virtual bool CanRemoveProperty(AppOptionProperty property)
		{
			return true;
		}
		protected string ToPatternText(AppOptionProperty prop)
		{
			return $"%{prop.ValiableName}%";
		}