具有设计器可浏览属性的VB.NET用户控件在运行时未保存值

Chr*_*ris 4 .net vb.net user-controls visual-studio-designer visual-studio

我一直在做一个控件,并为(CustomClass)列表添加了一个属性。该自定义类包含一个字符串,一个图像以及另一个包含一个字符串和一个图像的自定义类的列表。我已通过添加可浏览属性将此属性添加到设计器中,并且所有属性似乎均可与此一起正常工作。

运行程序时出现我的问题。我可以在属性中设置所有值,然后可以返回它们并保存它们,但是,一旦我运行该程序,由于该属性设置为Nothing,这些值将被清除。

为了允许编辑和保存我的属性,我意识到我必须初始化列表,并且已经在属性的accessor方法中进行了初始化(如果属性的值为空)。

我已经在设计器中修改了值,并在使用该属性及其基础字段的所有项目以及该属性的方法本身上放置了一个断点。第一个断点命中是访问它,该值始终为空。

我不确定应该将值存储在哪里,因为我已经检查了设计器代码,该值通常将在其中存储诸如字符串之类的类型,并且我已经检查了资源以查看它们是否已保存在那里(就像图像一样)。 。运行代码后,设计器中的值也将被清除。

控件内的一些代码

    Private _Items As List(Of Models.Category) = New List(Of Models.Category)

<Browsable(True), _
EditorBrowsable(EditorBrowsableState.Always), _
Category("Data"), _
Description("The items with sub items that should be displayed"), _
    DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Public Property Items As List(Of Models.Category)
    Get
        'Return _Items
        Return Me.ExpMenu1.Categories
    End Get
    Set(ByVal value As List(Of Models.Category))
        Me.ExpMenu1.Categories = value
        '_Items = value
    End Set
End Property
Run Code Online (Sandbox Code Playgroud)

ExpMenu1中有问题的代码

        ''' <summary>
    ''' Gets or sets the categories.
    ''' </summary>
    ''' <value>The categories.</value>
    Public Property Categories() As List(Of Category)
        Get
            If m_Categories Is Nothing Then
                m_Categories = New List(Of Category)
            End If
            Return m_Categories
        End Get
        Set(ByVal value As List(Of Category))
            m_Categories = value
                       End Set
    End Property
Run Code Online (Sandbox Code Playgroud)

顶级班(类别)

Imports System.Collections.Generic

Namespace ExpandingMenuWPF.Models
    ''' <summary>
    ''' Category class.
    ''' </summary>
    Public Class Category
        ''' <summary>
        ''' Gets or sets the name of the category.
        ''' </summary>
        ''' <value>The name of the category.</value>
        Public Property CategoryName() As String
            Get
                Return _CategoryName
            End Get
            Set(ByVal value As String)
                _CategoryName = value
            End Set
        End Property
        Private _CategoryName As String
    ''' <summary>
    ''' Gets or sets the sub items.
    ''' </summary>
    ''' <value>The Sub Items.</value>
    Public Property SubItems() As List(Of SubItem)
        Get
            Return _SubItems
        End Get
        Set(ByVal value As List(Of SubItem))
            _SubItems = value
        End Set
    End Property
    Private _SubItems As New List(Of SubItem)

    Private _ShowImage As Boolean
    Public Property ShowImage() As Boolean
        Get
            Return _ShowImage
        End Get
        Set(ByVal value As Boolean)
            _ShowImage = value
        End Set
    End Property

    Private _Image As Image
    Public Property CategoryImage() As Image
        Get
            Return _Image
        End Get
        Set(ByVal value As Image)
            _Image = value
        End Set
    End Property


End Class
End Namespace
Run Code Online (Sandbox Code Playgroud)

嵌套类(子项)

Namespace ExpandingMenuWPF.Models
''' <summary>
''' Sub Item class.
''' </summary>

Public Class SubItem

    Public Sub New()

    End Sub

    ''' <summary>
    ''' Gets or sets the title.
    ''' </summary>
    ''' <value>The title.</value>
    Public Property Title() As String
        Get
            Return _Title
        End Get
        Set(ByVal value As String)
            _Title = value
        End Set
    End Property
    Private _Title As String

    Private _ShowImage As Boolean
    Public Property ShowImage() As Boolean
        Get
            Return _ShowImage
        End Get
        Set(ByVal value As Boolean)
            _ShowImage = value
        End Set
    End Property

    Private _Image As Image
    Public Property SubItemImage() As Image
        Get
            Return _Image
        End Get
        Set(ByVal value As Image)
            _Image = value
        End Set
    End Property

End Class
End Namespace
Run Code Online (Sandbox Code Playgroud)

如果有人对值的存储位置有任何想法或知识,我将非常感激。我认为我没有做任何特别复杂的事情。

Resx文件。项目数据的部分:

<data name="ExpandingVerticalMenu1.Items" mimetype="application/x-microsoft.net.object.binary.base64">
<value>
    AAEAAAD/////AQAAAAAAAAAMAgAAAEdFeHBhbmRpbmdNZW51V1BGLCBWZXJzaW9uPTEuMC4wLjAsIEN1
    bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAwDAAAAUVN5c3RlbS5EcmF3aW5nLCBWZXJz
    aW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEz
    YQUBAAAAIEV4cGFuZGluZ01lbnVXUEYuTW9kZWxzLkNhdGVnb3J5BAAAAA1fQ2F0ZWdvcnlOYW1lCV9T
    dWJJdGVtcwpfU2hvd0ltYWdlBl9JbWFnZQEDAASNAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxp
    c3RgMVtbRXhwYW5kaW5nTWVudVdQRi5Nb2RlbHMuU3ViSXRlbSwgRXhwYW5kaW5nTWVudVdQRiwgVmVy
    c2lvbj0xLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGxdXQEUU3lzdGVt
    LkRyYXdpbmcuSW1hZ2UDAAAAAgAAAAYEAAAABENhdDEJBQAAAAAKBAUAAACNAVN5c3RlbS5Db2xsZWN0
    aW9ucy5HZW5lcmljLkxpc3RgMVtbRXhwYW5kaW5nTWVudVdQRi5Nb2RlbHMuU3ViSXRlbSwgRXhwYW5k
    aW5nTWVudVdQRiwgVmVyc2lvbj0xLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu
    PW51bGxdXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBAAAIUV4cGFuZGluZ01lbnVXUEYuTW9kZWxz
    LlN1Ykl0ZW1bXQIAAAAICAkGAAAAAQAAAAQAAAAHBgAAAAABAAAABAAAAAQfRXhwYW5kaW5nTWVudVdQ
    Ri5Nb2RlbHMuU3ViSXRlbQIAAAAJBwAAAA0DBQcAAAAfRXhwYW5kaW5nTWVudVdQRi5Nb2RlbHMuU3Vi
    SXRlbQMAAAAGX1RpdGxlCl9TaG93SW1hZ2UGX0ltYWdlAQAEARRTeXN0ZW0uRHJhd2luZy5JbWFnZQMA
    AAACAAAABggAAAAEU3ViMQAKCw==
</value>
Run Code Online (Sandbox Code Playgroud)

抱怨最后一行。

Cod*_*ray 5

在设计时对*.Designer.vb文件所做的更改的序列化由DesignerSerializationVisibility属性控制。

它可以具有三个可能的值之一

隐藏的:代码生成器不会为该对象生成代码。
可见:代码生成器为对象生成代码。
内容:代码生成器为对象的内容而不是对象本身生成代码。

在您的情况下,您正在尝试序列化a的内容List(Of T),这意味着您需要告诉代码生成器为对象的内容而不是对象本身(即DesignerSerializationVisibility.Content值)生成代码。

当前,您将值设置为Hidden,这将阻止代码生成器为该对象生成任何代码!更常见的错误是将其设置为Visible。虽然这几乎总是你想要的持久性,这是不是会为代表的集合(如属性做的工作List(Of T)),包含数据您感兴趣的序列化。

因此,您需要更改属性的声明以包括以下内容:

<Browsable(True), _
EditorBrowsable(EditorBrowsableState.Always), _
Category("Data"), _
Description("The items with sub items that should be displayed"), _
DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
Public Property Items As List(Of Models.Category)
    Get
        'Return _Items
        Return Me.ExpMenu1.Categories
    End Get
    Set(ByVal value As List(Of Models.Category))
        Me.ExpMenu1.Categories = value
        '_Items = value
    End Set
End Property
Run Code Online (Sandbox Code Playgroud)

那应该工作得很漂亮。在设计时所做的任何更改将由设计者代码生成器自动保存到表单的关联*.Designer.vb文件中,并与项目一起保存。但是,如注释中所述,这不适用于运行时所做的更改。