Отображение атрибутов динамических типов объектов на PropertyGrid - PullRequest
0 голосов
/ 06 марта 2011

Мне нужно включить редактирование свойств произвольных объектов (тип объекта известен только во время выполнения). Я создал следующий класс:

public class Camera
{
    [TypeConverter(typeof(ExpandableObjectConverter))]
    public object Configuration
    {
        get
        {
            return configuration; 
        }
        set 
        {
            configuration = value;
        }
    }

    public Class1 a;
    [TypeConverter(typeof(ExpandableObjectConverter))]
    public Class1 A
    {
        get
        {
            return a; 
        }
        set 
        {
            a = value;
        }
    }
}

После выбора объекта «Камера» я вижу свойство Class1 в PropertyGrid, но не вижу свойства объекта «Конфигурация». Как я могу решить эту проблему?

1 Ответ

1 голос
/ 08 марта 2011

Я предполагал, что ваша форма станет видимой до того, как будет назначено свойство Configuration. Вы не предоставили достаточно кода, чтобы увидеть, так ли это. Чтобы проверить мою озабоченность, я создал два объекта конфигурации:

public class Configuration1
{
    public string Test { get; set; }
    public byte Test1 { get; set; }
    public int Test2 { get; set; }
}

и

public class Configuration2
{
    public char Test3 { get; set; }
    public List<string> Test4 { get; set; }
}

Я изменил класс вашей камеры, чтобы он выглядел так:

public class Camera
{
    public Camera()
    {
        Configuration1 = new Configuration1();
        Configuration2 = new Configuration2();
    }
    private object configuration;

    [TypeConverter(typeof(ExpandableObjectConverter))]
    public object Configuration { get; set; }

    [TypeConverter(typeof(ExpandableObjectConverter))]
    public Configuration1 Configuration1 { get; set; }

    [TypeConverter(typeof(ExpandableObjectConverter))]
    public Configuration2 Configuration2 { get; set; }
}

Затем я создал форму с PropertyGrid и двумя экземплярами Button. Я настроил формы взаимодействия следующим образом:

public partial class Form1 : Form
{
    private readonly Camera camera = new Camera();
    public Form1()
    {
        InitializeComponent();

        propertyGrid1.SelectedObject = camera;
    }

    private void Button1Click(object sender, System.EventArgs e)
    {
        camera.Configuration = new Configuration2();
        UpdatePropertyGrid();
    }

    private void Button2Click(object sender, System.EventArgs e)
    {
        camera.Configuration = new Configuration1();
        UpdatePropertyGrid();
    }

    private void UpdatePropertyGrid()
    {
        propertyGrid1.Refresh();
        propertyGrid1.ExpandAllGridItems();
    }
}

Вид запуска выглядит так:

enter image description here

После нажатия первой кнопки:

enter image description here

После нажатия второй кнопки:

enter image description here

Если вы удалите обновление, сетка свойств будет работать неправильно. Альтернативой является предоставление интерфейса с INotifyPropertyChanged для ваших классов и свойств.

...