说我有财产 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 通用(从任何意义上讲),因此可以用来编辑 FooBaz?

有帮助吗?

解决方案 2

我刚刚发现,如果我让 EditValue 返回其他 objectvalue, set 将在编辑起源的属性上调用,因此要做:

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

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

其他提示

您可以使用 provider 获取在物业网格中编辑的属性的名称。要查看此设定的编辑例程中的断点 EditValue,然后徘徊在 provider 财产。将其展开,您会看到它包含一个属性,上面有foo/baz的名称。不确定这是否是获取信息的推荐方法,但它似乎有效。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top