Пользовательский CollectionEditor никогда не вызывает метод "set" свойства - PullRequest
1 голос
/ 12 мая 2011

Я пытаюсь реализовать способ сохранения коллекции в классе пользовательских настроек.Я успешно создал класс параметров (наследующий 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

Я установил точку останова в методах Set для свойства BackgroundColor и свойства EmailAddresses.Свойство BackgroundColor работает должным образом - оно разрывается в операторе Set и правильно сохраняет свойство.Но когда я закрываю пользовательское диалоговое окно CollectionEditor, метод EmailAddresses «Set» никогда не вызывается.Как я могу заставить свой пользовательский редактор действительно сохранить свойство, как только оно будет отредактировано?

1 Ответ

1 голос
/ 12 мая 2011

Кажется, я это исправил (с помощью этот вопрос ).Я добавил переопределение к функции 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

И теперь все работает так, как должно.Но если это не лучший способ или есть более простой способ сделать это, пожалуйста, включите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...