一般的なTypeeditorを作成します
-
10-10-2019 - |
質問
私が財産を持っているとします Foo
タイプの SomeType
タイプのクラスで SomeClass
カスタムエディターで編集されています SomeTypeEditor
:
[EditorAttribute(typeof(SomeTypeEditor), ...)]
public SomeType Foo
{
get
{
return BuildFooFromInternalRepresenation();
}
set
{
UpdateInternalRepresentation(value);
}
}
SomeTypeEditor.EditValue
関数は次のように見えます:
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
IWindowsFormsEditorService edSvc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (null == edSvc)
{
return null;
}
var form = new SomeTypeEditorForm(value as SomeType);
if (DialogResult.OK == edSvc.ShowDialog(form))
{
var someClass = context.Instance as SomeClass;
someClass.Foo = form.Result;
return someClass.Foo;
}
else
{
return value;
}
}
別のプロパティを追加したいと思います Baz
, 、タイプの SomeType
, 、 に SomeClass
. 。このプロパティを編集したいと思います SomeTypeEditor
しかし、ライン
someClass.Foo = form.Result;
の EditValue
ネクタイ SomeTypeEditor
この特定のプロパティに。それは単に重複するだけでは簡単です SomeTypeEditor
編集 Baz
代わりに、可能であればそれを避けたいと思います。とにかく私を作るためにありますか SomeTypeEditor
ジェネリック(単語の意味で)を使用して両方を編集するために使用できます Foo
と Baz
?
解決 2
私はちょうど私が許すならば、私はちょうどそれを見つけました EditValue
別のものを返します object
よりも value
, set
編集が発生したプロパティで呼び出されるので、ただ行うだけです。
if (DialogResult.OK == edSvc.ShowDialog(form))
{
var someClass = context.Instance as SomeClass;
return form.Result;
}
作品(SomeTypeEditor
入力値をクローンし、クローンを編集します)。
他のヒント
使用できます provider
プロパティグリッドで編集されているプロパティの名前を取得します。これを見るには、編集ルーチンのブレークポイントを設定する EditValu
e、次にホバリングします provider
財産。それを拡張すると、編集されているFoo/Bazの名前のプロパティが含まれていることがわかります。これが情報を取得するための推奨される方法であるかどうかはわかりませんが、機能しているようです。