Custom CollectionEditor永远不会触发属性的“set”方法

时间:2011-05-11 20:32:15

标签: vb.net visual-studio-2010 propertygrid collectioneditor

我正在尝试在自定义设置类中实现一种持久化集合的方法。我已成功创建了设置类(继承了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”方法。如何在编辑完成后让我的自定义编辑器实际保存属性?

1 个答案:

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

现在一切都像它应该的那样工作。但如果这不是最好的方法,或者有更简单的方法,请加入。