0

CollectionEditorで作成された新しいオブジェクトを特定の参照で初期化する必要があります。

具体的には、PropertyGridで編集できるオブジェクトPipelineがあります。このオブジェクトには、マーカーのコレクションが含まれています。マーカーは、いくつかの計算を行うためにパイプラインへの参照を必要とします。

現在、PropertyGridforPipelineにはマーカーのエントリがあります。楕円形のボタンをクリックすると、CollectionEditorが表示されます。プロパティの編集は問題ありませんが、作成された新しいマーカーの現在のパイプラインも設定する必要があります。そのための最善の方法がわかりません。監視できるイベントはありますか?カスタムCollectionEditorを作成する必要がありますか(ただし、特定のパイプラインについてどのように知ることができますか?)?

4

1 に答える 1

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;
}
于 2011-01-27T15:30:56.603 に答える