代码之家  ›  专栏  ›  技术社区  ›  Andreas Brinck

生成通用类型编辑器

  •  1
  • Andreas Brinck  · 技术社区  · 14 年前

    说我有财产 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 也有类型 基类型 ,为了 身体类 . 我想编辑这个属性 类型编辑器 但这条线

    someClass.Foo = form.Result;
    

    在里面 EditValue 领带 类型编辑器 对这个特别的财产。只要复制一份 类型编辑器 哪些编辑 巴兹 相反,如果可能的话,我想避免这种情况。有什么可以让我 类型编辑器 通用的(在任何意义上的词),以便它可以用来编辑 巴兹 ?

    2 回复  |  直到 14 年前
        1
  •  0
  •   Phil Wright    14 年前

    你可以使用 provider 获取正在属性网格中编辑的属性的名称。要查看此设置,请在编辑例程上设置一个断点 EditValu 然后将鼠标悬停在 供应商 财产。展开它,您将看到它包含一个名为foo/baz正在编辑的属性。不确定这是否是获取信息的推荐方法,但似乎有效。

        2
  •  0
  •   Andreas Brinck    14 年前

    我刚发现如果我让 EditValue 返回一个不同的 object value , set 将在源于编辑的属性上调用,因此只需执行以下操作:

    if (DialogResult.OK == edSvc.ShowDialog(form))
    {
        var someClass = context.Instance as SomeClass;
        return form.Result;
    }
    

    作品( SomeTypeEditor 克隆传入值并编辑克隆)。