Как правильно редактировать коллекцию в сетке свойств? - PullRequest
2 голосов
/ 10 ноября 2010

У меня есть класс, который отображается в сетке свойств.Одним из свойств является List<SomeType>.

. Какой самый простой / правильный способ настроить код, чтобы я мог добавлять и удалять элементы из этой коллекции через сетку свойств, предпочтительно с использованием стандартного CollectionEditor.

Один из неправильных способов выглядит следующим образом:

набор не вызывается при редактировании коллекции

Пользовательские аннакеты предлагают мне выставить IEnumerable интерфейс вместо коллекции.Может ли кто-нибудь предоставить мне более подробную информацию?

У меня есть дополнительное осложнение, заключающееся в том, что коллекция, возвращаемая get, на самом деле не указывает на участника в моем классе, а построена на лету от другого участника.примерно так:

public List<SomeType> Stuff
{
    get
    {
        List<SomeType> stuff = new List<SomeType>();
        //...populate stuff with data from an internal xml-tree
        return stuff;
    }
    set
    {
        //...update some data in the internal xml-tree using value
    }
}

Ответы [ 2 ]

6 голосов
/ 10 ноября 2010

Это немного хитрый;решение включает в себя сборку с полной .NET Framework (поскольку клиентская среда не включает System.Design).Вам нужно создать свой собственный подкласс CollectionEditor и сообщить ему, что делать с временной коллекцией после того, как пользовательский интерфейс завершит работу с ней:

public class SomeTypeEditor : CollectionEditor {

    public SomeTypeEditor(Type type) : base(type) { }

    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) {
        object result = base.EditValue(context, provider, value);

        // assign the temporary collection from the UI to the property
        ((ClassContainingStuffProperty)context.Instance).Stuff = (List<SomeType>)result;

        return result;
    }
}

Затем вы должны украсить свою собственность с помощью EditorAttribute:

[Editor(typeof(SomeTypeEditor), typeof(UITypeEditor))]
public List<SomeType> Stuff {
    // ...
}

Длинный и запутанный, да, но это работает.После того, как вы нажмете «ОК» во всплывающем окне редактора коллекции, вы сможете снова открыть его, и значения останутся.

Примечание. Необходимо импортировать пространства имен System.ComponentModel, System.ComponentModel.Design и System.Drawing.Design.

0 голосов
/ 10 ноября 2010

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

using System;
using System.Collections.Generic;
using System.Windows.Forms;
class Foo {
    private readonly List<Bar> bars = new List<Bar>();
    public List<Bar> Bars { get { return bars; } }
    public string Caption { get; set; }
}
class Bar {
    public string Name { get;set; }
    public int Id { get; set; }
}
static class Program {
    [STAThread]
    static void Main() {
        Application.EnableVisualStyles();
        Application.Run(new Form {
            Controls = { new PropertyGrid { Dock = DockStyle.Fill,
                                            SelectedObject = new Foo()
        }}});
    }
}
...