类型字典的属性

时间:2014-06-19 14:53:35

标签: vb.net dictionary

有没有办法在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

但是当我尝试这个时,字符串集合编辑器窗口打开但是添加&删除按钮被禁用。声明此属性的正确方法是什么?

我想添加密钥&通过设计师的价值。

1 个答案:

答案 0 :(得分:2)

Dictionary没有内置UITypeEditor。有许多原因没有:有两种类型是通用的,它也没有Item访问器,没有简单的Add方法,键必须是唯一的,没有以序列化词典“item”的方式构建。

正确的方式是使用继承自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

注意事项:

为Foobar项目编写类容器几乎总是更好。通常你会继承Collection<T>List<T>如图所示是一个容器和一个集合,因此当暴露如图所示时,内容可以被清除,重置,修改等。它们虽然快速且易于实现,但基本概念是相同的。

如果一个词典真的是你想要的,你可以编写自己的UITypeEditor(不是UIDesigner,这不是一个控件),但这可能需要在很多层面上做大量的工作。它们没有飞来飞去的原因是,大多数人都会使用其中一个标准集合,并以其他方式强制执行唯一名称。 (向用户控件添加“属性”,表明实际上key或名称应该提前修复并且应该为应用程序所知,因此它知道它是什么以及如何处理它(?)。) / p>

VS通常可以使用FooBar中的简单属性自行执行设计器序列化。但是,由于它们是集合中的项目,您可能还需要编写一个TypeConverter来返回InstanceDescriptor,以帮助VS实例化它们。但这是一个不同的问题。