假设我在类型为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
的{{1}}就可以了,但我想尽可能避免这种情况。无论如何我的SomeTypeEditor
通用(在任何意义上)都可以用来编辑Foo
和Baz
?
答案 0 :(得分:0)
您可以使用provider
获取属性网格中正在编辑的属性的名称。要查看此设置,请在编辑例程EditValu
e上设置一个断点,然后将鼠标悬停在provider
属性上。展开它,您将看到它包含一个名为Foo / Baz的属性正在编辑中。不确定这是否是获取信息的推荐方法,但它似乎有效。
答案 1 :(得分:0)
我刚刚发现,如果我让EditValue
返回与object
不同的value
,则会在编辑所源自的属性上调用set
,所以这样做的:
if (DialogResult.OK == edSvc.ShowDialog(form))
{
var someClass = context.Instance as SomeClass;
return form.Result;
}
工作(SomeTypeEditor
克隆传入的值并编辑克隆)。