Внедрение подполей в PropertyGrid

Хорошо, поэтому моя терминология, когда дело доходит до С#, невелика, поэтому я попытаюсь объяснить это небольшим примером. Если вы создаете класс, который вы используете в PropertyGrid, и у вас есть следующие значения:

class Test
{
    public Point example { get; set; }
}

Это создаст PropertyGrid, который имеет расширяемый объект "example", который имеет поля X и Y, чтобы создать "Точку".

Я пытаюсь создать объект "name" с полями "firstname" и "lastname", поэтому у меня есть:

class Test
{
    public Name example { get; set; }
}

public struct Name
{
    public string firstname { get; set; }
    public string lastname { get; set; }
}

Это, однако, не работает должным образом.

Я думаю, мне нужно переопределить некоторые методы, чтобы получить эту работу, однако, поскольку у меня нет реальной терминологии для PropertyGrids, мне сложно найти решение.

Любая помощь будет большой.

Ответы

Ответ 1

После многого огляделся, наконец, смог понять, недостающее ключевое слово было "ExpandableObjectConverter".

В любом случае, вот пример кода:

public Form1()
{
    InitializeComponent();

    Person x = new Person();
    propertyGrid1.SelectedObject = x;
}

public class Person
{
    public string Caption { get; set; }

    [TypeConverter(typeof(ExpandableObjectConverter))]
    public class Name
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }

        public override string ToString()
        {
            return LastName + ", " + FirstName;
        }
    }

    private Name _name = new Name();

    public Name testName
    {
        get { return _name; }
    }
}

PropertyGrids уверены, что запутываются.

Ответ 2

Я считаю, что в этом случае определения автоспециализированных свойств

   public string Name { get; set; }

не работают для типов struct, но типов классов. В первом примере Point - тип класса.

Try

class Name
{
  public string FirstName {get;set;}
  public string LastName {get;set;}
}

затем

class Test
{
  public Name example {get; set;}
}

может работать.