2011-09-24 122 views
1

我很确定这是一个愚蠢的问题,但我所有的尝试都失败了。
我有一个自定义控件,我希望有一个复杂的属性暴露许多属性。我想这样做,因为我将在可视属性管理器中有一个可扩展属性,所以我可以很容易地设置子属性,因为它们在父属性中分组在一起。 这是我做了什么架构:UserControl自定义属性变灰

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 { ... } 
    } 
} 

}

当我插入我的自定义控件的形式(使用相同的解决方案中另一个项目),我打开的属性,既快捷方式测试是灰色的,不可扩展,所以我不能在它们内部设置属性。
有什么问题?有没有更好的方法来属性比创建一个类或结构?
感谢大家!

回答

3

IIRC您需要编写一个TypeConverter以获取属性窗口来展开这些属性。

假设您使用以下类型的复杂属性:

[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; } 
    } 
} 

你的性能可能看起来像这样的时刻:

enter image description here

注意,拼写检查选项属性变灰。

您需要创建一个TypeConverter来转换您的对象类型,以便它可以正确显示。 .NET框架提供了ExpandableObjectConverter类来使这更容易。

例如:

public class SpellingOptionsConverter:ExpandableObjectConverter 
{ 
    //... 
} 

您需要按照下列步骤来创建一个自定义类型转换器。

实现一个简单的类型转换器,可以一个字符串转换为一个点

  1. 定义,从ExpandableObjectConverter(或类型转换器)派生的类。
  2. 重写CanConvertFrom方法,该方法指定转换器可以从哪种类型进行转换。此方法已超载。
  3. 重写实现转换的ConvertFrom方法。此方法已超载。
  4. 重写CanConvertTo方法,该方法指定转换器可以转换为哪种类型。无需重写此方法以转换为字符串类型。此方法已超载。
  5. 重写实现转换的ConvertTo方法。此方法已超载。
  6. 重写执行验证的IsValid方法。此方法已超载。

看看下面的MSDN页关于如何实现一个类型转换器的详细信息:您所创建的类型转换器

How to: Implement a Type Converter

后,您可以将其应用到您的自定义类型。

[TypeConverterAttribute(typeof(SpellingOptionsConverter)), 
DescriptionAttribute("Expand to see the spelling options for the application.")] 
public class SpellingOptions{ ... } 

而且一切都会好起来:

enter image description here

我赶紧总结从MSDN的elobarate例子。您可以在这里找到一个完整的演练:

Getting the Most Out of the .NET Framework PropertyGrid Control

+0

我会接受你的答案,因为它是认真细致的(!因为照片中的宝宝是伟大的,我是家长太...)。一个问题:想象一下我想创建一个快捷方式类:是否需要重写_ExpandableObjectConverter_派生类中的某个特定属性,或者我可以在您告诉我的每个属性中调用base.prop()? – Marco

+0

不完全确定你的意思,但是你必须实现ConvertFrom(...)方法将输入的值转换回你的ShortCuts类的类型。在我的回答(http://msdn.microsoft.com/zh-cn/library/aa302326.aspx)中查看第二个链接的“添加可扩展属性支持”一节下的第5点。 –

+0

非常感谢,真的非常感谢!我必须学习(老实说,我认为实现复杂的属性更容易),但是你让我走上了正确的道路。再次感谢!! :) – Marco