我需要初始化使用CollectionEditor创建的任何具有特定引用的新对象。
更具体地说,我有一个可以在PropertyGrid中编辑的对象Pipeline。该对象包含一系列标记。标记需要引用Pipeline才能进行一些计算。
目前,PropertyGrid for Pipeline有一个Markers条目。单击椭圆按钮将显示CollectionEditor。编辑属性很好,但我还需要为创建的任何新标记设置当前的管道。我不确定这样做的最好方法。我可以监控哪些事件?我是否需要创建自定义CollectionEditor(但它对特定管道有什么了解?)?
答案 0 :(得分:1)
您需要创建自定义CollectionEditor以及自定义PropertyDescriptor类。 您的PropertyDescriptor可以通过重写PropertyDescriptor.GetEditor来存储传递给集合编辑器的PipeLine对象。 您可以让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;
}