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

Я создал элемент управления и добавил свойство для списка (из 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

Вложенный класс (подпункт)

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 Ответ

3 голосов
/ 17 августа 2011

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

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

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

В вашем случае вы пытаетесь сериализоватьсодержимое 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 и сохранено вместе с вашим проектом.Однако, как обсуждалось в комментариях, это не будет работать для изменений, сделанных во время выполнения .

...