من از کلاس سفارشی هم برای این Collection استفاده کردم ولی در این مورد حتی اجازه اضافه کردن آیتم به خصوصیت هم نمی دهد:
Imports System.ComponentModel
<Serializable(), TypeConverter(GetType(VariableCollectionConverter) )> _
Public Class VariableCollection
Inherits List(Of VariableItem)
Overloads Sub Add(Name As String, Value As String)
MyBase.Add(New VariableItem(Name, Value))
End Sub
Overloads Sub Add(Item As VariableItem)
MyBase.Add(Item)
End Sub
End Class
Imports System.Reflection
Imports System.ComponentModel
Imports System.ComponentModel.Design.Serialization
Imports System.Collections.Generic
Public Class VariableCollectionConverter
Inherits TypeConverter
Public Overrides Function ConvertFrom(context As System.ComponentModel.ITypeDescriptorContext, culture As System.Globalization.CultureInfo, value As Object) As Object
If TypeOf (value) Is String Then
Dim Coll As New VariableCollection
Dim Expr As String = value
Dim Items As String() = Expr.Split("/")
Dim NV As String() = {}
Dim v As VariableItem
For Each Item As String In Items
NV = Item.Split(":")
v = New VariableItem(NV(0), NV(1))
Coll.Add(v)
Next
Return Coll
End If
Return MyBase.ConvertFrom(context, culture, value)
End Function
Public Overrides Function ConvertTo(context As System.ComponentModel.ITypeDescriptorContext, culture As System.Globalization.CultureInfo, value As Object, destinationType As System.Type) As Object
If destinationType Is GetType(String) Then
Dim Expr As String = ""
With DirectCast(value, VariableCollection)
For i = 0 To .Count - 1
Expr += String.Format("{0}:{1}/", .Item(i).Name, .Item(i).Value)
Next
End With
If Expr.Length = 0 Then Return Expr
Return Expr.Remove(Expr.Length - 1, 1)
ElseIf destinationType Is GetType(InstanceDescriptor) Then
Dim ci As ConstructorInfo = GetType(VariableCollection).GetConstructor(New Type() {GetType(List(Of VariableItem))})
Dim t As VariableCollection = CType(value, VariableCollection)
Return New InstanceDescriptor(ci, t.ToArray)
End If
Return MyBase.ConvertTo(context, culture, value, destinationType)
End Function
Public Overrides Function CanConvertTo(context As System.ComponentModel.ITypeDescriptorContext, destinationType As System.Type) As Boolean
If destinationType Is GetType(String) Or destinationType Is GetType(InstanceDescriptor) Then
Return True
End If
Return MyBase.CanConvertTo(context, destinationType)
End Function
End Class