Проблема DataBound UserControl и PropertyNameChanged Event в .net winforms - PullRequest
0 голосов
/ 30 октября 2009

У меня есть UserControl, с TextBox и свойством привязки к данным - Value. Значением может быть любой объект, такой как цвет, массив, шрифт и т. Д. Каждый раз, когда изменяется текст, свойство Value изменяется до тех пор, пока оно действительно.

Просмотр статьи MSDN: Как: применить шаблон PropertyNameChanged , он говорит, что я должен использовать шаблон PropertyNameChanged Event со стороны управления.

Теперь, если у меня DataSourceUpdateMode = OnValidate, мне даже не нужно применять этот шаблон. Если, скажем. мое свойство Value привязано к цветному полю в бизнес-объекте, затем после ввода красного цвета в текстовом поле и перехода к другому полю, а затем любые другие поля в форме, которые привязываются к тому же цветному полю, обновляются немедленно.

Если, однако, мой DataSourceUpdateMode = OnPropertyChange, я ожидаю, что все другие поля в форме обновятся, как только я нажму 'd' (как в 're'd').

Этого не происходит. Итак, я применяю вышеупомянутый шаблон PropertyNameChanged, но этого все еще не происходит.

Однако, если я удаляю событие PropertyNameChanged и, вместо этого, использую INotifyPropertyChanged, он работает отлично.

Моя проблема в том, что согласно статье, INotifyPropertyChanged должен использоваться вашими бизнес-объектами, а не пользовательским элементом управления.

Это работает, но я не хочу сталкиваться с какими-либо проблемами в будущем.

Кто-нибудь знает, что происходит?

ETA:

Предполагая, что можно использовать INotifyPropertyChanged, у меня теперь есть еще одна проблема. Я не хочу, чтобы пользователям приходилось подписываться на событие PropertyChanged, а затем проверять аргументы, чтобы узнать, послало ли его свойство Value. Итак, добавляю:

Public Event ValueChanged As EventHandler(Of EventArgs)

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

Полагаю, мне нужно переименовать событие ValueChanged в FeckingValueChanged или что-то в этом роде.

Я бы не возражал, если бы фреймворк действительно что-то делал с вызванным событием ValueChange, во-первых!

1 Ответ

1 голос
/ 31 октября 2009

Хорошо, я обнаружил, что код, указанный на MSDN, неверен. Ниже я выделил неправильные детали и показал исправления:

Некорректное

Public DataSourceChanged As EventHandler

Private Sub OnDataSourceChanged() 
    If (DataSourceChanged IsNot Nothing) Then
        DataSourceChanged(Me, New EventArgs())
    End If
End Sub

Корректное

Public **Event** DataSourceChanged As EventHandler

Private Sub OnDataSourceChanged() 
    If (DataSourceChangedEvent IsNot Nothing) Then
        **RaiseEvent** DataSourceChanged(Me, New EventArgs())
    End If
End Sub

Я обнаружил, что вы должны объявить это событие точно, иначе привязка данных, OnPropertyChanged, не будет работать.

Например, по какой-то причине следующее не будет работать:

Публичное событие DataSourceChanged As EventHandler ( из EventArgs )

Использование INotifyPropertyChanged также работает, но вы также не можете получить ожидаемое событие PropertyNameChanged, на которое пользователи могут рассчитывать на подписку.

...