2010-08-25 4 views
2

Je suis en train d'ajouter une propriété imbriquée à mon contrôle personnalisé à l'aide d'un TypeConverter, voici mon code de test:Problème avec TypeConverter personnalisé et les propriétés imbriquées dans le concepteur

public class TestNestedOptionConverter : TypeConverter 
{ 
    public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, 
     object value, Attribute[] filter) 
    { 
     return TypeDescriptor.GetProperties(typeof(TestNestedOption)); 
    } 

    public override bool GetPropertiesSupported(ITypeDescriptorContext context) 
    { 
     return true; 
    } 
} 

[TypeConverter(typeof(TestNestedOptionConverter))] 
public class TestNestedOption 
{ 
    bool test1 = false; 

    [Description("TestParam1")] 
    public bool Test1 
    { 
     get { return test1; } 
     set { test1 = value; } 
    } 

    [Description("TestParam2")] 
    public int Test2 { get; set; } 
} 

public partial class UserControl1 : UserControl 
{ 
    public TestNestedOption TestOption { get; set; } 

    public UserControl1() 
    { 
     InitializeComponent(); 
    } 
} 

Quand j'ajouter le contrôle à un formulaire, je vois la propriété TestOption dans la grille de propriétés du concepteur, mais les sous-propriétés n'apparaissent pas du tout (il n'y a même pas de zone d'expansion à côté de TestOption).

Ma compréhension de ceci est qu'il est censé appeler sorte de récursive la méthode GetProperties() sur chaque propriété, donc comme un test de hack je mets un MessageBox.Show() dans la méthode TestNestedOptionConverter.GetProperties(), et je ne vois pas le message lorsque le concepteur charge le contrôle. Cela me fait penser que le concepteur GetProperties() n'est jamais appelé par le concepteur pour une raison quelconque.

Des idées sur ce que je fais mal?

J'utilise Visual Studio 2008.

Répondre

2

Il ne peut pas afficher les propriétés de l'objet parce que l'objet est nul. Essayez de créer simplement un nouvel objet dans le constructeur UserControl1:

public partial class UserControl1 : UserControl 
{ 
    public TestNestedOption TestOption { get; set; } 

    public UserControl1() 
    { 
     InitializeComponent(); 
     TestOption = new TestNestedOption(); 
    } 
} 

De plus, plutôt que d'écrire un TypeConverter personnalisé pour cela, vous pouvez simplement utiliser ExpandableObjectConverter, qui fait exactement ce que vous avez écrit. Si vous devez remplacer d'autres méthodes, vous pouvez toujours en hériter.

+0

Merci, c'est exactement ce que je cherchais. – WildCrustacean

Questions connexes