Ручное использование привязки данных WriteValue

Если я выключаю автоматическое обновление обязательного источника данных установкой DataSourceUpdateMode = Никогда и затем использую кнопку для обновления всех (использующий привязку. WriteValue), проблема происходит - А именно, только источник данных первого связанного элемента управления обновляется. Все другие средства управления сбрасываются назад к исходным значениям.

Это вызвано тем, что, когда текущий объект изменяется (как это происходит после вышеупомянутого WriteValue), если ControlUpdateMode = OnPropertyChange, то все другие средства управления перечитывали в значении от источника данных.

Каков стандартный способ избежать этой проблемы?

Один путь состоит в том, чтобы получить класс из BindingSource и добавить метод WriteAllValues. Этот метод делает следующее:

(1) Для каждой Привязки сохраните ControlUpdateMode

(2) Для каждой Привязки, набор ControlUpdateMode = Никогда

(3) Для каждой Привязки назовите Метод WriteValue

(4) Для каждой Привязки, сброс ControlUpdateMode к сохраненному значению

(5) Для каждой Привязки, если ControlUpdateMode = OnPropertyChange, называют метод ReadValue.

Можно ли видеть какие-либо проблемы с выполнением этого?

Если работа с Вашими собственными классами, реализация IEditableObject решили бы вопрос?

В другом управлении я продолжаю работать, я реализую свою собственную привязку. Путем я двигаюсь, проблема в этом со следующим кодом. (Я вставил абсолютный минимум, я надеюсь, что можно следовать за ним!):

Private Shared ControlDoingExplicitUpdate As MyCustomControl = Nothing

Private Sub UpdateDataSourceFromControl(ByVal item As Object, ByVal propertyName As String, ByVal value As Object)
  Dim p As PropertyDescriptor = Me.props(propertyName)
  Try
    ControlDoingExplicitUpdate = Me
    p.SetValue(item, value)
  Catch ex As Exception
    Throw
  Finally
    ControlDoingExplicitUpdate = Nothing
  End Try
End Sub

Private Sub DataBindingSource_CurrentItemChanged(ByVal sender As Object, ByVal e As System.EventArgs)
  If (ControlDoingExplicitUpdate IsNot Nothing) AndAlso (ControlDoingExplicitUpdate IsNot Me) Then Exit Sub
  Me.UpdateControlFromDataSource() 'Uses ReadValue
End Sub

Так, когда UpdateDataSourceFromControl назовут, все события CurrentItemChanged назовут для всех других средств управления в том же BindingSource. Однако, потому что ControlDoingExplicitUpdate установлен, они не перечитают в значении от источника данных, если они, окажется, не будут управлением, которое сделало обновление. ControlDoingExplicitUpdate ни на Что не установлен после того, как все эти события завершились, так, чтобы нормальный сервис возобновился.

Я надеюсь, что можно следовать за этим, и - снова - я спрашиваю, можно ли видеть какие-либо проблемы с этим?

8
задан Neolisk 15 February 2013 в 18:56
поделиться