Как различить привязку данных и действия пользователя в элементах управления WinForm - PullRequest
2 голосов
/ 15 октября 2008

У меня есть типичная проблема с ловлей 22. У меня есть элемент управления .NET WinForm, который содержит текстовое поле и флажок. Оба элемента управления являются данными, привязанными к свойствам в экземпляре класса данных. Текстовое поле для цены, флажок, чтобы указать, что цена является переопределением цены. Также в классе данных есть свойство, которое содержит первоначальную цену товара.

Я бы хотел, чтобы элементы управления соблюдали следующие правила:

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

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

Я пытался отследить условия, в которых я явно обновляю что-то, что вызовет событие изменения управления. Это работает только для части этого, хотя. Событие изменения текстового поля запускается в другие моменты, которые находятся вне моего контроля, например, когда привязка данных запускается при первоначальном отображении формы.

Я искал вокруг, и я думаю, что я просто не придумываю правильные условия поиска, чтобы найти то, что я ищу. Кажется, что привязка данных прекрасна и изящна до тех пор, пока вам не понадобится что-то практичное, например, взаимодействие двух связанных элементов управления друг с другом. Кажется, просто нет способа отличить то, что вызвало управляющие события.

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

У кого-нибудь есть предложения?

Ответы [ 2 ]

4 голосов
/ 15 октября 2008

Я бы предложил не обрабатывать логику в коде формы, а в классе данных. Все, что вам нужно в форме - это пара строк для настройки привязки данных. Класс данных может позаботиться об остальном:

Форма

Private _dc As DataClass

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    _dc = New DataClass
    txtPrice.DataBindings.Add("text", _dc, "Price")
    chkOverride.DataBindings.Add("checked", _dc, "override")
End Sub

Класс данных

Private _originalPrice As Double = 50

Private _price As Double = _originalPrice
Public Property Price() As Double
    Get
        Return _price
    End Get
    Set(ByVal value As Double)
        If (_price <> value) Then
            _price = value
            Override = _price <> _originalPrice
        End If
    End Set
End Property


Private _override As Boolean
Public Property Override() As Boolean
    Get
        Return _override
    End Get
    Set(ByVal value As Boolean)
        If _override <> value Then
            _override = value
            If Not _override Then Price = OriginalPrice
        End If
    End Set
End Property

Нет необходимости обрабатывать какие-либо события CheckedChanged или TextChanged в форме.

0 голосов
/ 15 октября 2008

Рассматривали ли вы обработку события TextBox TextChanged для обработки состояния CheckBox вместо его привязки?

Затем можно сравнить текущее значение TextBox с исходным и определить, должен ли CheckBox быть истинным или ложным.

Еще одна мысль: вы можете унаследовать TextBox и добавить свойства в свой собственный TextBox, чтобы TextBox обрабатывал свое собственное состояние. Например, оно может иметь свойство IsOriginal только для чтения.

У меня сейчас нет установленного VS, поэтому я не проверял его, дайте мне знать, если вам нужен пример.

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