Обновление сетки свойств во время разработки, когда в .Net изменяется коллекция только для чтения, Winforms - PullRequest
1 голос
/ 03 марта 2010

У меня есть класс, который имеет свойство коллекции только для чтения - это список поставщиков расширений, которые были применены к элементу управления.

Я реализовал простой дескриптор свойства для коллекции, чтобы свойство можно было развернуть в сетке свойств для проверки каждой записи.

Когда я выбираю провайдера расширителя и задаю для него значение false, я удаляю его из коллекции. Требуется метод GetProperties преобразователя типов и обновляется сетка свойств.

Однако, когда я устанавливаю для поставщика расширений значение true и, таким образом, добавляю его в коллекцию, GetProperties не запрашивается.

Каким-то образом в сетке свойств проводится различие между добавлением и удалением из коллекции. Или, альтернативно, его обновление при добавлении поставщика расширений, но не при его удалении.

Как я могу обновить сетку при добавлении в коллекцию?

Я пробовал INotifyPropertyChanged и (PropertyName) изменен, но безуспешно.

ETA:

Я собрал небольшой образец, чтобы разобраться в моей проблеме. Для краткости этот пример использует массив и будет сохраняться, хотя и не правильно. Это не влияет на поведение во время разработки, хотя:

Public Class MyButton
    Inherits Button

    Private _Col As String()
    <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
    Public ReadOnly Property Col() As String()
        Get
            Return Me._Col
        End Get
    End Property

    Private _AlterCol As String
    ''''''<RefreshProperties(RefreshProperties.All)> _
    Public Property AlterCol() As String
        Get
            Return _AlterCol
        End Get
        Set(ByVal value As String)
            _AlterCol = value
            ReDim Preserve Me._Col(Me._Col.Length)
            Me._Col(Me._Col.Length - 1) = value
        End Set
    End Property

    Public Sub New()
        ReDim Me._Col(2)
        Me._Col(0) = "Fred"
        Me._Col(1) = "Jim"
        Me._Col(2) = "Bob"
    End Sub

End Class

Теперь, чтобы увидеть поведение в действии, добавьте MyButton в форму, разверните свойство Col и введите некоторый текст в свойство AlterCol.

Расширенные вложенные свойства в Col не изменятся. Однако закомментируйте RefreshProperties.All, и он будет запрашиваться и обновляться.

Моя проблема в том, что я не обновляю Col из свойства Read / Write. Я обновляю его в ответ на добавление внешнего провайдера. Мне нужно как-то обновить сетку свойств. Единственный способ, которым я могу думать об этом, - фиктивное свойство, украшенное RefreshProperties, которому я присваиваю измененное значение. Есть идеи?

1 Ответ

0 голосов
/ 03 марта 2010

Вы перехватываете INotifyPropertyChanged ... после получения события вам может потребоваться "отключить" сетку свойств, переустановить и обновить ее ... или вы не перехватываете событие PropertyChanged сетки свойств ? Парень из C # здесь ... так что это может сделать вас бесполезным ...?

// Within your trapping of the INotifyPropertyChanged Event Handler

    // Set 'SelectedObject' to null
    propGrid.SelectedObject = null;
    //
    propGrid.SelectedObject = this object
    //
    propGrid.Refresh();    

Вот пример захвата измененного свойства ....

private void propGrid_PropertyValueChanged(object s, PropertyValueChangedEventArgs e) {
       // Handle the property changed for the 'propGrid' conmponent
}

Редактировать: Как указало Жюль , необходимость сделать это была во время разработки, поэтому копаясь вокруг, я нашел кое-что, что могло бы быть поучительным на CodeProject ... и здесь объясняется, как использовать использование Extendee, используемого для элементов управления ..., чтобы получить представление о проблеме.

Звучит так, как будто вам нужно сделать класс расширением и связать его с сеткой свойств во время выполнения ...

Посмотрите здесь также на понимание IExtenderProvider здесь на CodeProject также, который объясняет, как использовать таблицу стилей CSS и применить ее к форме окна ...

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

...