有没有办法在VB.Net中声明string类型字典的属性。 我在usercontrol上使用它来通过设计器添加属性。
我尝试了以下内容:
Private v As Dictionary(Of String, String)
Public Property VList As Dictionary(Of String, String)
Get
Return v
End Get
Set(ByVal value As Dictionary(Of String, String))
v = value
End Set
End Property
但是当我尝试这个时,字符串集合编辑器窗口打开但是添加&删除按钮被禁用。声明此属性的正确方法是什么?
我想添加密钥&通过设计师的价值。
答案 0 :(得分:2)
Dictionary
没有内置UITypeEditor
。有许多原因没有:有两种类型是通用的,它也没有Item
访问器,没有简单的Add
方法,键必须是唯一的,没有以序列化词典“item”的方式构建。
正确的方式是使用继承自 注意事项: 为Foobar项目编写类容器几乎总是更好。通常你会继承 如果一个词典真的是你想要的,你可以编写自己的 VS通常可以使用Collection<T>
的Collection类,以便您可以控制对内容的访问(注意:这来自System.Collections.ObjectModel
而不是< / strong>可怕的VB收藏!)。设置工作界面的快速方式是使用List(Of myTypeClass)
,但这在生产代码中很危险,因为它允许您可能不需要的内部列表上的各种操作。 / p>
<Serializable><TypeConverter(GetType(FooConverter))>
Public Class FooBar
<DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)>
Public Property Name As String
<DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)>
Public Property Value As String
' simple ctor REQUIRED for the UITypeEditor
Public Sub New()
Name = ""
Value = ""
End Sub
' ctor for the TypeConverter (NOT included)
Public Sub New(n As String, v As String)
Name = n
Value = v
End Sub
Public Overrides Function ToString
Return Name
End Sub
End Class
' must be instanced
Private myFoo As New List(Of FooBar)
' list is an object so it cant be serialized, but the CONTENTS can be
<DesignerSerializationVisibility(DesignerSerializationVisibility.Content)>
Public Property FooList As List(of FooBar)
Get
If myFoo Is Nothing Then
myFoo = New List(of FooBar)
End If
Return myFoo
End Get
Set
' do nothing
End Set
End Sub
' for designer serialization
Private Function ShouldSerializeFooList As Boolean
Return myFoo.Count > 0 ' or myFoo IsNot Nothing
End Sub
public Sub ResetMyFolist
myFoo = New List(of FooBar)
End Sub
Collection<T>
。 List<T>
如图所示是一个容器和一个集合,因此当暴露如图所示时,内容可以被清除,重置,修改等。它们虽然快速且易于实现,但基本概念是相同的。UITypeEditor
(不是UIDesigner,这不是一个控件),但这可能需要在很多层面上做大量的工作。它们没有飞来飞去的原因是,大多数人都会使用其中一个标准集合,并以其他方式强制执行唯一名称。 (向用户控件添加“属性”,表明实际上key
或名称应该提前修复并且应该为应用程序所知,因此它知道它是什么以及如何处理它(?)。) / p>
FooBar
中的简单属性自行执行设计器序列化。但是,由于它们是集合中的项目,您可能还需要编写一个TypeConverter
来返回InstanceDescriptor
,以帮助VS实例化它们。但这是一个不同的问题。