VB.NET Usercontrol с доступным для просмотра свойством конструктора, не сохраняющим значения во время выполнения

Я делал элемент управления и добавил свойство для списка (CustomClass). Пользовательский класс содержит строку, изображение и список другого пользовательского класса, который содержит строку и изображение. Я добавил это свойство в конструктор, добавив просматриваемые атрибуты, и все, кажется, работает правильно с этим.

Моя проблема возникает при запуске программы. Я могу установить все значения в свойстве, и я могу вернуться к ним, и они сохраняются, однако, как только я запускаю программу, значения стираются, так как свойство имеет значение Nothing.

Чтобы разрешить редактирование и сохранение моего свойства, я понимаю, что должен инициализировать список и сделал это в методе доступа свойства (если значение свойства - ничто).

Я изменил значения в конструкторе и установил точку останова для всех элементов, которые используют свойство и его базовое поле, а также для самих методов свойства. Первое попадание в точку останова - доступ к нему, и значение всегда равно нулю.

Я не уверен, где значения должны храниться, так как я проверил код конструктора, где он обычно хранит типы, такие как строки, и я проверил ресурсы, чтобы увидеть, были ли они там сохранены (как изображение), После запуска кода значения в конструкторе также стираются.

Некоторый код в элементе управления

    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

Оскорбительный код внутри 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

Класс высшего уровня (категория)

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

Вложенный класс (Subitem)

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

Если у кого-то есть идеи или знания о том, где следует хранить ценности, я был бы удивительно благодарен. Я не думаю, что делаю что-то особенно сложное.

Resx File. Часть данных товаров:

<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>

Жалуется на последнюю строчку.

1 ответ

Сериализация изменений, внесенных во время разработки в ваш *.Designer.vb файл контролируется DesignerSerializationVisibility атрибут

Может иметь одно из трех возможных значений:

Скрытый: генератор кода не создает код для объекта.
Видимый: генератор кода создает код для объекта.
Содержимое: генератор кода создает код для содержимого объекта, а не для самого объекта.

В вашем случае вы пытаетесь сериализовать содержимое 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

Это должно работать прекрасно. Любое изменение, внесенное во время разработки, будет автоматически сохранено генератором кода дизайнера в связанной с ним форме. *.Designer.vb файл и сохранить вместе с вашим проектом. Однако, как обсуждалось в комментариях, это не будет работать для изменений, внесенных во время выполнения.

Другие вопросы по тегам