NULL

快乐的活着...【四分之一的精力献给了工作,四分之三的精力献给了女人...】

  博客园 :: 首页 :: 新随笔 ::  :: 订阅 订阅 :: 管理 ::
  37 随笔 :: 1 文章 :: 1131 评论 :: 42 Trackbacks
主题
    关于控件属性的元数据的使用方法

开篇语
    在上一章中,简单的介绍了属性的分类,如果忘记了,可以返回上一章看看
    其实,话又说回来,有的东西,只要知道她是怎么回事就行,没必要硬是给她盖个名字,易或弄个定义,为“定义而定义”,倒是显得有点迂腐

开始了
    为了说明属性的一些基本元数据的使用方法,在这里做一个显示name,age,address的自定义People控件,然后我们一一给这些属性加上她们的元数据
    
    1.1定义People的枚举类型职业        
Code
    
    其实,我不喜欢做程序设计员,倒是想做农场主,放放羊,摘摘葡萄,傍晚拥美女入梦,呵呵,做梦罢了:)
 
    
    1.2定义People的住址(就是自定义类型的复杂属性)
    
Code

    这年头,做人难,做男人更难,要结婚吧,女方硬是要买房子。北京,上海的房子想都不敢想,所以选了湖南,长沙,河西麓谷,这个小地方

    1.3呈现People
    
Code

    这年头,做技术的,25,26结婚的少,再过两年吧

    好了,预备工作都做了,那么一个个来看元数据
    
     1.4 在设计时要用到的DesignerSerializationVisibility
          当设置为Hidden时,你会发现右边可视窗口中的属性,在“源”中,没有生成对应的标记
      这是怎么回事呢?当设置为Content时,你会惊奇的发现,生成了对应的标记,哈哈,记住,她的作用就是生成对应的标记,不要想多了

      1.5 解决自定义类型相互转换的TypeConverter
           当屏蔽掉[TypeConverter(typeof(ExpandableObjectConverter))]的时候,你会发现Address这个复杂属性中的子属性不见了
       
       
            没错,可能你已经想到了,自定义类型需要转换成String,Int,或者其他...,她就是起这么个作用
        虽然,ExpandableObjectConverter类型已经替我们做一些转换工作,但是有时候,我们可以定义自己的ObjectConverter,后面的章节再讲

        1.6 还记得事件”冒泡“吗?NotifyParentProperty(true)刚好派上用场
             当屏蔽掉复杂属性的每个子属性的NotifyParentProperty(true)时,你会发现,修改复杂属性中的某项时,压根修改不了,又是怎么回事呢?
        记得事件冒泡的原理是,把复合控件中的子对象的事件,一层一层向容器,或者说向外传递。复杂属性也是这个“道道”
        当我们修改子属性,要想(父亲)复杂属性知道,我们还得标记一下Notify父Property。

        1.7 编译生成
        
        结果生成连字符形式的复杂属性
                
<cc1:people id="People1" runat="server" age="25" customaddress-city="长沙" customaddress-state="中国"
            customaddress-street
="河西麓谷" customaddress-zip="413000" family="未婚" name="王孟军"></cc1:people>

        这样就行了吗?当然不是,这只是我们看到的“连字符”形式的复杂属性,我们来想办法做成“内镶属性”,以方便阅读标记
        
        1.8  内镶复杂属性
        设置Address属性[PersistenceMode(PersistenceMode.InnerProperty)]
        
设置People类型[ParseChildren(true)]和[PersistChildren(false)]

        再次编译运行,你会发现

<cc1:people id="People1" runat="server" age="25" family="未婚" name="王孟军">

            
<CustomAddress Street="河西麓谷" City="长沙" State="中国" Zip="413000"></CustomAddress>

        
</cc1:people>

        Address变成了内镶属性,呵呵
        来看看是怎么生成的,PersistenceMode是一个“属性级别”的元数据,想做成内镶属性,设置为InnerProperty就行
        不要去看MSDN上的解释,什么持久化,把人都搞晕!
        
         [ParseChildren(true)]和[PersistChildren(false)]都是“类型级别”的元数据,因为Address属性是要解析成属性,而不是解析成子控件,所以我们
         Pasee Children as Attribute is true(应该这样翻译,解析子对象作为属性,Yes),而PersistChildren意思刚好相反。

总结

        简单的讲了一下,两种复杂属性的实现方法,以及常用的元数据的使用,在下一章,将继续讲自定义类型属性的状态保存,和自定义类型转换
        有不妥之处,望    大家指点,thanks

        demo下载

参考
        <<道不远人>>
        <<Developing Microsoft ASP.NET Server Controls and Components Microsoft >>
posted on 2008-05-16 09:14 王孟军! 阅读(1823) 评论(9)  编辑 收藏 所属分类: asp.net Controls

评论

#1楼 [楼主] 2008-05-16 09:19 王孟军!      
昨天,我发布了一篇关于“属性”的文章,很多朋友抱怨,字体看不清楚,由于昨天一直没时间,所以今天一早,起来,再写了一次,发布,OK了
抱歉
  回复  引用  查看    

#2楼  2008-05-16 10:07 Tony.chen [未注册用户]
是的,我希望LZ以后写文章的时候尽量要注意下用户体验,本身技术类的文章要边读边想,要是字体不好看,那看完真是蛮累的
  回复  引用    

#3楼 [楼主] 2008-05-16 10:09 王孟军!      
@Tony.chen
:)
不好意思
  回复  引用  查看    

#4楼  2008-05-16 10:45 子曰2 [未注册用户]
LZ 光头是因为做程序导致头发太少了.所以干脆递掉了吧.呵呵
  回复  引用    

#5楼  2008-05-16 10:47 johnnyshieh      

== 其实,我不喜欢做程序设计员,倒是想做农场主,放放羊,摘摘葡萄,傍晚拥美女入梦,呵呵,做梦罢了:) ==

我也经常做这样的梦啊!


  回复  引用  查看    

#6楼  2008-05-16 11:16 allies [未注册用户]
我每次都会很注意看他的照片~习惯性的 恩恩 我觉得很有个性!
  回复  引用    

#7楼  2008-05-16 13:39 beamsea [未注册用户]
这应该是一个不经意的动作,看看,还是双眼皮呢,哎,一个字,帅!
  回复  引用    

#8楼 [楼主] 2008-05-16 14:18 王孟军!      
@beamsea
@allies
@子曰2
先谢了
不过,这里是技术blogs,最好不要讨论我的头,或者其他的什么
这里只谈技术
  回复  引用  查看    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-07-25 21:59 编辑过


相关链接: