自定义组件之属性(Property)的性质(Attribute)介绍(三)

原创 2004年02月29日 13:23:00

2、展开的形式<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

展开的形式多用于一个属性为我们自定义类的类型,比如我们定义了一个类,该类中的一个属性是另一个我们定义的类。在这种情况下属性浏览器默认是没有办法来进行类型转换的,所以显示为不可编辑的内容。如果我们要以展开的形式编辑这个属性就需要我们向上面一样来重写属性转换器。

我们首先定义一个自己的类来作为以后的属性类型。具体代码如下:

public class ExpandProperty

{

     private int _intList=0;

     public int IntList

     {

        get { return this._intList;}

        set { this._intList=value; }

     }

 

     private string _strList="Null";

     public string StrList

     {

        get { return this._strList;}

        set { this._strList= value;}

     }

}

然后我们在自己的另一个类中声明一个这个类型的属性,在这里如果我们不加任何的性质限制,属性浏览器是不能转换改属性的。具体实现该属性的代码如下:

     private ExpandProperty _dropList;

 

     [CategoryAttribute("自定义的复杂类型设置(包括自定义类型转换器)"),

     TypeConverterAttribute(typeof(PropertyGridApp.ExpandConverter)),

     ReadOnlyAttribute(false)]

     public ExpandProperty DropList

     {

        get { return this._dropList;}

        set { this._dropList= value;}

     }

为了让属性浏览器能够编辑该属性,也就是说能够把该属性转换成字符串,而且能够从字符串转换成该类的一个实例需要我们写如下的代码:

/// <summary>

///  可以展开的类型转换器

///     ExpandProperty

/// </summary>

public class ExpandConverter:System.ComponentModel.ExpandableObjectConverter

{

     public ExpandConverter()

     {

     }

 

     /// <summary>

     /// 覆盖此方法已确定属性是否可以转换

     /// </summary>

     public override bool CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType)

     {

        if (destinationType==typeof(PropertyGridApp.ExpandProperty))

                return true;

 

        return base.CanConvertTo(context,destinationType);

     }

 

     /// <summary>

     /// 覆盖此方法并确保destinationType参数是一个String,然后格式化所显示的内容

     /// </summary>

     public override object ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType)

     {

        if (destinationType == typeof (System.String) && value is PropertyGridApp.ExpandProperty)

        {

            PropertyGridApp.ExpandProperty source=(PropertyGridApp.ExpandProperty)value;

            return source.IntList+","+source.StrList;

        }

 

        return base.ConvertTo(context,culture,value,destinationType);

 

     }

 

     /// <summary>

     /// 覆盖此方法已确定输入的字符串是可以被转化

     /// </summary>

     public override bool CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType)

     {

        if (sourceType==typeof(string))

            return true;

        return base.CanConvertFrom(context,sourceType);

 

     }

 

     /// <summary>

     /// 覆盖此方法根据 ConvertTo() 方法的转换格式来把所输入的字符串转换成类,并返回该类

     /// </summary>

     public override object ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)

     {

        if (value is string)

        {

            string s=(string)value;

            int comma=s.IndexOf(",");

            if (comma!=-1)

            {

               try

               {

                   string intList=s.Substring(0,comma);

                   string strList=s.Substring(comma+1,s.Length-comma-1);

                   PropertyGridApp.ExpandProperty Ep=new ExpandProperty();

                   Ep.IntList=int.Parse(intList);

                   Ep.StrList=strList;

                   return Ep;

               }

               catch

               {

                   return base.ConvertFrom(context,culture,value);

               }

            }

        }

 

        return base.ConvertFrom(context,culture,value);

     }

}

编译之后的画面如下:

Unity Editor 基础篇(七):Property Attributes自定义属性

本文参自:http://mp.weixin.qq.com/s/kjoS2DaAADBUPMg1kHwnSg 本文为本人学习上连接的笔记有改动,请点击以上链接查看原文,尊重楼主知识产权。Propert...
  • qq_33337811
  • qq_33337811
  • 2017年03月26日 15:03
  • 2173

Vue 常用API整理 1 - 组件属性与方法

Vue 常用 API 整理 1 - 组件属性与方法1. 单文件组件说明 .vue 文件是一个自定义的文件类型,用类HTML语法描述一个Vue组件。每个 .vue 文件包含三种类型的顶级语言块 ...
  • mjzhang1993
  • mjzhang1993
  • 2017年10月19日 17:00
  • 469

DOM之属性(attribute)和自定义对象属性(property)

DOM节点有一些属性和对象属性. 有时候我们会把他们搞混淆, 因为他们是相关联的, 但是他们真的是两个不同的东西. 特性 DOM节点是一个对象. 因此它可以存储自定义的对象属性和方法,就像...
  • qq_30325409
  • qq_30325409
  • 2016年04月15日 16:24
  • 310

Python进阶之“属性(property)”详解

来源:http://python.jobbole.com/80955/ Python中有一个被称为属性函数(property)的小概念,它可以做一些有用的事情。在这篇文章中,我们将看到如何能做以下几点...
  • freeking101
  • freeking101
  • 2016年09月12日 10:28
  • 3711

android 自定义控件属性

android 自定义控件属性
  • coderinchina
  • coderinchina
  • 2016年05月10日 16:06
  • 1782

Android 自定义属性(Attribute)详解

前言 定义属性Attribute资源 实例 定义XML属性资源 自定义ImageView类 使用 MainActivity代码前言Android本身给我们提供了很多的属性,像我们经常要用到的:andr...
  • Airsaid
  • Airsaid
  • 2016年05月15日 17:23
  • 1418

EBS OAF开发中属性集(Attribute Set)的介绍和手工实现

EBS OAF开发中属性集(Attribute Set)的介绍和手工实现(版权声明,本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处;否则请与本人联系,违者必究)在OAF开发中就和For...
  • tavor
  • tavor
  • 2014年01月13日 15:33
  • 2414

html 中的属性(property)以及DOM对象中的attributes的详解

先来讲讲今天的主题: 探索property(也就是html的某些属性,比如input的value id这些自带属性)和attributes(html中能看到的所有属性,包括自定义属性)的差异 先来讲...
  • maoguiyou
  • maoguiyou
  • 2016年12月14日 19:17
  • 1374

Qt之自定义属性Q_PROPERTY

QT提供了一个成熟的属性系统,但是作为一个跨平台的且与编译器无关的库,qt不依赖于非标准的编译器功能例如 __property or [property]; QT的强大之处在于它可以支持任何标准的c...
  • u010780613
  • u010780613
  • 2015年12月23日 14:52
  • 4562

C# 中自定义Attribute值的获取与优化

C#自定义Attribute值的获取是开发中会经常用到的,一般我们的做法也就是用反射进行获取的,代码也不是很复杂。 1、首先有如下自定义的Attribute [AttributeUsage(A...
  • hegx2001
  • hegx2001
  • 2015年12月18日 15:46
  • 7253
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:自定义组件之属性(Property)的性质(Attribute)介绍(三)
举报原因:
原因补充:

(最多只允许输入30个字)