使用可浏览,可扩展字段创建属性

cjw*_*cjw 4 .net vb.net typeconverter

为了澄清我的要求,请查看设计器中的Font属性.单击其下拉列表时,您将获得ForeColor,ImeMode,Language等选项.

我想要同样的下拉列表,允许我输入我自己添加到设计器的属性的多个值(它将用于我的自定义控件中的数据库属性,并为您提供选择版本,类型等的选项. ).

我该怎么做呢?我看了一遍,我找不到解决方案.

谢谢.

Ňɏs*_*arp 6

您正在寻找的是由a提供的TypeConverter.具体来说,你需要一个ExpandableObjectConverter- 这会"打破"子属性.我的假类型 - 它是你控制的替身:

Public Class Widget
    Public Property Name As String
    Public Property FooValue As Integer

    Public Property XYOffset As Offset
     ...
Run Code Online (Sandbox Code Playgroud)

Offset 本身就是一个由三个属性组成的类型:

Public Class Offset
    Public Property Name As String
    Public Property X As Int32
    Public Property Y As Int32
    ...
    Public Overrides Function ToString() As String
        Return String.Format("{0}: ({1}, {2})", Name, X.ToString, Y.ToString)
    End Function
Run Code Online (Sandbox Code Playgroud)

如果不清楚,Widget将是您的控制,XYOffset将是您询问的财产.该ToString()覆盖是这样,你不弄丑型号名称(WindowsApplication14.SomeType房地产网格).PropertyGrid控件中的结果:

在此输入图像描述

它被禁用,因为NET不知道如何编辑Offset对象.这只需要最简单的一个TypeConverters:

Public Class XYOffsetConverter
    Inherits ExpandableObjectConverter

    ' more to come 
End Class
Run Code Online (Sandbox Code Playgroud)

装饰物业:

Public Class Offset
     ...
    <TypeConverter(GetType(XYOffsetConverter))>
    Public Property XYOffset As Offset
Run Code Online (Sandbox Code Playgroud)

Offset属性可以使用:<TypeConverter(GetType(ExpandableObjectConverter))>但由于您提到这是一个CustomControl,您将在TypeConverter以后需要其他功能(请参阅注释).结果是核心功能几乎没有工作:

在此输入图像描述

由于NET 确实知道如何编辑 StringInt32编辑工作在打开的属性.缺少两个方面:
a)当您编辑子属性时,Offset属性"摘要"不会更新(X在图像中不匹配)
b)用户无法编辑顶部的"摘要"字符串来更改属性.

修复第一个很容易.只需向属性添加一个属性Offset:

Public Class Offset
    <NotifyParentProperty(True)>
    Public Property Name As String
    <NotifyParentProperty(True)>
    Public Property X As Int32
    <NotifyParentProperty(True)>
    Public Property Y As Int32
Run Code Online (Sandbox Code Playgroud)

现在,每个子属性编辑后的摘要更新:

在此输入图像描述

修复B并不难 - 你只需要解析你创建的字符串ToString()并从中返回一个新的偏移量.然而,它没有必要,只是很好,因为他们可以打开它并编辑每个值.

另一件事是它取决于那些东西是什么,我不想猜你的类型(类)是什么样的.大多数TypeConverters是特定类型的,我不知道你的样子.

我为示例使用了属性网格,但控件在VS属性窗口中的工作方式相同.

注意
您表明这是一个自定义控件.在这种情况下,您将需要帮助VS序列化您的类型,因为它不知道如何Offset创建在设计器中创建的类型.这是你的另一份工作TypeConverter.我只是不知道你的样子.