views:

71

answers:

1

I have an app that allows the user to choose an image, at design time, either as a straight image, or from an image list.

All cool so far, except that this is not happening from the visual studio property browser, its happening from a property grid that is a part of a type editor.

My problem is, both the image picker (actually resource picker), and the imagelist type converter rely on some design-time services to get the job done. In the case of imagelist, its the IReferenceService and in the case of the resource picker its a service called _DTE.

In the first instance of an edit from the visual studio property browser, I could get a reference to these services but (1) how can I add them to the type descriptor context of my property grid?

It would be better, for future proofing, if I could just copy a reference to all of the services in the type descriptor context. (2) Where does the property browser get these services from in the first place?

ETA: I still don't know how to do it, but I now know it is possible.

(1) Sub-class control and add a property whose type is an array of buttons.
(2) Add it to a form.
(3) Select the new control on the design service and edit the new property in the property browser.
(4) The collection editor dialog pops-up
(5) Add a button
(6) Edit image and image list - the type editor and type converter, respectively, behave as they should.

ETA2: Ok, I'm getting warm. It looks like you do it through the Site property of the property grid. I can create a new site, and pass it the type descriptor context I have a reference to and then it should have all the service. I'll give it a go ...

ETA3: Yes, that's it. I'll add an answer.

+1  A: 

Thanks to reflector and the framework CollectionEditor, I found the answer was through the Site property of the PropertyGrid. This is what you do:

(1) Save a reference to the ITypeDescriptor context. You can do this from the first edit from the property browser or design surface.

(2) After creating your own property grid, set the Site property to a new site that contains all the services from the original context.

Instead of reinventing the wheel, use reflector and, go to System.ComponentModel.Design.CollectionEditor.PropertyGridSite and crib the code.

Jules