0

我需要使用特定引用初始化使用 CollectionEditor 创建的任何新对象。

更具体地说,我有一个可以在 PropertyGrid 中编辑的对象 Pipeline。该对象包含一组标记。标记需要对 Pipeline 的引用才能进行一些计算。

目前,管道的 PropertyGrid 有一个标记条目。单击椭圆按钮会调出 CollectionEditor。编辑属性很好,但我还需要为创建的任何新标记设置当前管道。我不确定最好的方法。有我可以监控的事件吗?我是否需要创建一个自定义的 CollectionEditor(但它如何知道有关特定管道的任何信息?)?

4

1 回答 1

1

您需要创建一个自定义 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;
}
于 2011-01-27T15:30:56.603 回答