Инициализация возражений, созданных в .NET CollectionEditor с определенной ссылкой - PullRequest
0 голосов
/ 20 декабря 2010

Мне нужно инициализировать любые новые объекты, созданные с CollectionEditor, с определенной ссылкой.

В частности, у меня есть объект, Pipeline, который можно редактировать в PropertyGrid.Этот объект содержит коллекцию маркеров.Маркеры нуждаются в ссылке на Pipeline для выполнения некоторых вычислений.

В настоящее время в PropertyGrid для конвейера есть запись для маркеров.Нажатие на кнопку эллипса вызывает CollectionEditor.Редактирование свойств - это хорошо, но мне нужно также установить текущий конвейер для всех новых созданных маркеров.Я не уверен в лучшем способе сделать это.Есть ли события, которые я могу отслеживать?Нужно ли создавать собственный CollectionEditor (но как он узнает что-то о конкретном конвейере?)?

1 Ответ

1 голос
/ 27 января 2011

Вам необходимо создать собственный CollectionEditor, а также собственный класс PropertyDescriptor.Ваш PropertyDescriptor может хранить объект PipeLine, который передается в редактор вашей коллекции путем переопределения PropertyDescriptor.GetEditor.Вы можете позволить PipeLine создавать новые объекты Markers и выполнять любую необходимую инициализацию.

Вот код, с которого можно начать:

public class MyCollectionEditor : System.ComponentModel.Design.CollectionEditor
{
private Pipeline _pipeline;

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

    public MyCollectionEditor(Type type, Pipeline pipeline) : base(type)
    {
      _pipeline = pipeline;
    }

    protected override object CreateInstance(Type itemType)
    {
      return _pipeline.CreateNewMarker();
    }
}

public class MyPropertyDescriptor : PropertyDescriptor
{
private PipeLine _pipeline;

public MyPropertyDescriptor(PipeLine pipeline) : base(name, null)
{
  _pipeline = pipeline;
}

public override object GetEditor(Type editorBaseType)
{
  return new MyCollectionEditor(typeof(MarkerCollection), _pipeline);
}

// ... other overrides ...

}

// ...
// Implement System.ComponentModel.ICustomTypeDescriptor.GetProperties

public System.ComponentModel.PropertyDescriptorCollection GetProperties()
{
PropertyDescriptorCollection pdc = new PropertyDescriptorCollection(null);
foreach (Marker m in Markers) {
    MyPropertyDescriptor pd = new MyPropertyDescriptor(m);
    pdc.Add(pd);
}
return pdc;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...