I'm quite sure this is a stupid question, but all my tries failed.
I have a custom control in which I'd like to have a complex property exposing many properties. I want to do this because I would have an expandable property in visual property manager, so I can set sub-properties easily because grouped together in parent property. This is a schema of what I've done:public partial class QViewer : UserControl
{
private Shortcuts toolsShortcuts = new Shortcuts();
private TestProp testProp = new TestProp();
public Shortcuts ToolsShortcuts { get { return toolsShortcuts; } }
public TestProp Test { get { return testProp; } }
}
public struct TestProp
{
public bool DoIt;
public DateTime Date;
}
public class Shortcuts
{
Keys toolArrow = Keys.None;
public Keys Arrow
{
get { return toolArrow; }
set { ... }
}
}
}
When I insert开发者_运维技巧 my custom control in a form (using another project inside same solution) and I open properties, both Shortcuts and Test are grayed, not expandable, so I can't set properties inside them.
What's wrong? Is there a better way to group properties than creating a class or a struct? Thanks to everybody!IIRC you need to write a TypeConverter to get the properties window to expand these properties.
Let's assume you use the following type for a complex property:
[DescriptionAttribute("Expand to see the spelling options for the application.")]
public class SpellingOptions
{
private bool spellCheckWhileTyping = true;
private bool spellCheckCAPS = false;
private bool suggestCorrections = true;
[DefaultValueAttribute(true)]
public bool SpellCheckWhileTyping
{
get { return spellCheckWhileTyping; }
set { spellCheckWhileTyping = value; }
}
[DefaultValueAttribute(false)]
public bool SpellCheckCAPS
{
get { return spellCheckCAPS; }
set { spellCheckCAPS = value; }
}
[DefaultValueAttribute(true)]
public bool SuggestCorrections
{
get { return suggestCorrections; }
set { suggestCorrections = value; }
}
}
Your properties probably look like this at the moment:
Notice that the Spell Check Options property is grayed out.
You need to create a TypeConverter to convert your object type so it can be displayed correctly. The .NET framework provides the ExpandableObjectConverter class to make this easier.
For example:
public class SpellingOptionsConverter:ExpandableObjectConverter
{
//...
}
You need to follow these steps to create a custom TypeConverter.
To implement a simple type converter that can translate a string to a Point
- Define a class that derives from ExpandableObjectConverter (or TypeConverter).
- Override the CanConvertFrom method that specifies which type the converter can convert from. This method is overloaded.
- Override the ConvertFrom method that implements the conversion. This method is overloaded.
- Override the CanConvertTo method that specifies which type the converter can convert to. It is not necessary to override this method for conversion to a string type. This method is overloaded.
- Override the ConvertTo method that implements the conversion. This method is overloaded.
- Override the IsValid method that performs validation. This method is overloaded.
Take a look at the following MSDN page for more information on how to implement a TypeConverter:
How to: Implement a Type Converter
After you've created the TypeConverter you can apply it to your custom type.
[TypeConverterAttribute(typeof(SpellingOptionsConverter)),
DescriptionAttribute("Expand to see the spelling options for the application.")]
public class SpellingOptions{ ... }
And all will be well:
I quickly summarized an elobarate example from MSDN. You can find an entire walkthrough here:
Getting the Most Out of the .NET Framework PropertyGrid Control
精彩评论