none
关于自定义控件属性重置的问题 RRS feed

  • 问题

  • 各位好,我在做自定义控件时,需要将一个复杂属性设置为只读,但是这样的话在Properties编辑器中,右键该属性弹出菜单的Reset(重置)项是灰色的,请问如何解决这个问题。

    需求就是:该属性为只读;编辑器中可Reset;

    2010年7月1日 2:25

答案

  • 你好!

         你的需求有点矛盾啊!既然是只读的,当然不能重置了!

         如果你只是想限制用户的设置,可以在代码里判断的:

         public string Name

         {

               get

               {

                           return name;

                }

               set

               {

                         if(value!="default")

                         {

                                   name=default;

                          }

                }

         }


    周雪峰
    2010年7月1日 8:59
    版主
  • 你好,

    我想我有一个思路,但是不知道该怎样去执行

    思路是这样的,在自定义控件的Design-Time时Properties应该是个控件,通过反射可以查找如何调用Properties每个属性的右键菜单,就可以看出微软是如何判断修改Reset这一项的状态,这样应该可以根据原理来重写一些属性或者方法。

    只是我不知道这个菜单是在哪个类里面调用的,所以用reflector也找不到

    2010年7月2日 2:15

全部回复

  • 只读属性没有 set 访问器,因此一旦初始化后就不能对其赋值,设计器中的 Reset 菜单为灰色是正确的设计,没有其他办法在只读属性上启用此菜单。除非更改此属性为可读写。
    Mark Zhou
    2010年7月1日 8:55
  • 你好!

         你的需求有点矛盾啊!既然是只读的,当然不能重置了!

         如果你只是想限制用户的设置,可以在代码里判断的:

         public string Name

         {

               get

               {

                           return name;

                }

               set

               {

                         if(value!="default")

                         {

                                   name=default;

                          }

                }

         }


    周雪峰
    2010年7月1日 8:59
    版主
  • 你好,

    我想我有一个思路,但是不知道该怎样去执行

    思路是这样的,在自定义控件的Design-Time时Properties应该是个控件,通过反射可以查找如何调用Properties每个属性的右键菜单,就可以看出微软是如何判断修改Reset这一项的状态,这样应该可以根据原理来重写一些属性或者方法。

    只是我不知道这个菜单是在哪个类里面调用的,所以用reflector也找不到

    2010年7月2日 2:15
  • 解决了,IDE调用properties时使用的是标准propertyDescriptor,所以我重写了一个CustomerPropertyDescriptor,并且给自定义控件添加一个自定义TypeConverter,在GetProperties方法里修改自定义控件的PropertyDescriptorCollection

    2010年7月5日 9:02