MaskedInput class's Transform property that I described in depth in a few preceding blog posts presented us with an interesting design dilemma. At first it seemed like it should be a typical enumeration property, with one value for each Transform type. However, since the architecture allowed new Transform types to be added in a number of different ways (see the previous blog posts), the enum turned out to be too stifling. For that reason, we opted for a string instead. However, we still wanted to offer some Intellisense, to give the developer a hint at the values he would most likely want to use. We did it by placing the TypeConverterAttribute on the Transform property: public sealed class MaskedInput : BaseInput { ... [TypeConverter( typeof (MaskedInputTransformConverter))] public string Transform { get {...} set {...} } ... } The implementation of MaskedInputTransformConverter is very simple: /// <summary> /// Provides Visual Studio intellisense for Transform property. /// The list of StandardValues here corresponds to the properties of client-side ComponentArt_MaskedInput_Transforms object. /// </summary> public class MaskedInputTransformConverter : TypeConverter { public string [] StandardValues = { " empty ", " CreditCard_VisaMasterCard ", " CreditCard_AmEx ", " Telephone_NorthAmerica ", " ZipCode ", " PostalCode ", " PostalCode_Australia ", " EmailAddress " }; public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) { return new StandardValuesCollection(StandardValues); } public override bool GetStandardValuesSupported(ITypeDescriptorContext context) { return true ; } } This works really well in ASPX Intellisense, popping up the list of standard values, without forcing you to use one of them - exactly the behaviour we needed. The Intellisense also works for the Properties pane. Unfortunately it does not work in the CodeBehind files, and I don’t think there is a way to implement it there. Share this post: email it! | bookmark it! | digg it! | reddit!