我正在尝试在自定义设置类中实现一种持久化集合的方法。我已成功创建了设置类(继承了ApplicationSettingsBase),并且可以使用PropertyGrid上的内置编辑器保存属性,但我对集合的属性网格的自定义实现不会保留我添加的任何值。这是我的代码:
Imports System.Configuration
Imports System.ComponentModel
Imports System.Drawing.Design
Imports System.ComponentModel.Design
Public Class CustomSettings
Inherits ApplicationSettingsBase
<UserScopedSetting()> _
<DefaultSettingValue("White")> _
Public Property BackgroundColor() As Color
Get
BackgroundColor = Me("BackgroundColor")
End Get
Set(ByVal value As Color)
Me("BackgroundColor") = value
End Set
End Property
<UserScopedSetting()> _
<DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
<Editor(GetType(CustomStringCollectionEditor), GetType(UITypeEditor))> _
Public Property EmailAddresses() As Collection
Get
EmailAddresses = Me("EmailAddresses")
End Get
Set(ByVal value As Collection)
Me("EmailAddresses") = value
End Set
End Property
End Class
Public Class CustomStringCollectionEditor
Inherits CollectionEditor
Public Sub New()
MyBase.New(GetType(Collection))
End Sub
Protected Overrides Function CreateInstance(ByVal itemType As System.Type) As Object
Return String.Empty
End Function
Protected Overrides Function CreateCollectionItemType() As System.Type
Return GetType(String)
End Function
End Class
我在BackgroundColor属性和EmailAddresses属性的Set方法上设置了断点。 BackgroundColor属性可以正常工作 - 它在Set语句中断开并正确存储属性。但是,当我关闭自定义CollectionEditor对话框时,永远不会调用EmailAddresses“Set”方法。如何在编辑完成后让我的自定义编辑器实际保存属性?
答案 0 :(得分:1)
我想我已修好它(在this question的帮助下)。我在自定义编辑器中添加了对EditValue函数的覆盖。这是代码:
Public Overrides Function EditValue(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal provider As System.IServiceProvider, ByVal value As Object) As Object
Dim result As Object = MyBase.EditValue(context, provider, value)
DirectCast(context.Instance, CustomSettings).EmailAddresses = DirectCast(result, List(Of String))
Return result
End Function
我也从一个集合转移到一个列表 - 我读到了一个更安全的方式。我还在我的CustomSettings类中添加了一个构造函数,该类将EmailAddresses属性设置为新的List(Of String),如果它未被设置为开头。我发现它第一次运行时,我可以编辑列表并添加项目,但它们不会被保留:
Public Sub New()
If Me("EmailAddresses") Is Nothing Then
Me("EmailAddresses") = New List(Of String)
End If
End Sub
现在一切都像它应该的那样工作。但如果这不是最好的方法,或者有更简单的方法,请加入。