制作一个通用的TypeEditor

时间:2010-11-15 11:25:02

标签: c# generics uitypeeditor

假设我在类型为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通用(在任何意义上)都可以用来编辑FooBaz

2 个答案:

答案 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克隆传入的值并编辑克隆)。