Проблема с пользовательским TypeConverter и вложенными свойствами в конструкторе - PullRequest
2 голосов
/ 25 августа 2010

Я пытаюсь добавить вложенное свойство в свой пользовательский элемент управления с помощью TypeConverter, вот мой тестовый код:

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();
    }
}

Когда я добавляю элемент управления в форму, я вижу свойство TestOption всетка свойств дизайнера, но подчиненные свойства вообще не отображаются (рядом с TestOption нет даже окна расширения).

Мое понимание этого заключается в том, что предполагается, что это своего рода рекурсивный вызов метода GetProperties() для каждого свойства, поэтому в качестве тестового хака я поместил MessageBox.Show() в метод TestNestedOptionConverter.GetProperties(), и я надеваюне вижу сообщения, когда дизайнер загружает элемент управления.Это заставляет меня думать, что переопределенный GetProperties() никогда не вызывается дизайнером по какой-то причине.

Есть идеи о том, что я делаю неправильно?

Я использую Visual Studio 2008.

1 Ответ

2 голосов
/ 28 августа 2010

Невозможно отобразить свойства для объекта, потому что объект является нулевым. Попробуйте просто создать новый объект в конструкторе UserControl1:

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

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

Кроме того, вместо того, чтобы писать собственный TypeConverter для этого, вы можете просто использовать ExpandableObjectConverter , который делает именно то, что вы написали. Если вам нужно переопределить другие методы, вы все равно можете наследовать от него.

...