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