题
说我有财产 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的名称。不确定这是否是获取信息的推荐方法,但它似乎有效。
不隶属于 StackOverflow