Привязка данных и исключение в установщике - PullRequest
5 голосов
/ 19 мая 2009

Допустим, у меня есть простой класс

public class Person
{
  public string Name { get; set; }

  private int _age;
  public int Age
  {
    get { return _age; }
    set
    {
      if(value < 0 || value > 150)
        throw new ValidationException("Person age is incorrect");
      _age = value;
    }
  }
}

Тогда я хочу установить привязку для этого класса:

txtAge.DataBindings.Add("Text", dataSource, "Name");

Теперь, если я введу неправильное значение возраста в текстовом поле (скажем, 200), исключение в установщике будет проглочено, и я не смогу ничего сделать, пока я не исправлю значение в текстовом поле. Я имею в виду, что текстовое поле не сможет потерять фокус. Все тихо - без ошибок - вы просто не можете ничего сделать (даже закрыть форму или все приложение), пока не исправите значение.

Кажется, это ошибка, но вопрос в том, что для решения этой проблемы?

1 Ответ

4 голосов
/ 19 мая 2009

Хорошо, вот решение:

Нам нужно обработать событие BindingComplete класса BinsingSource, CurrencyManager или BindingBanagerBase. Код может выглядеть так:

/* Note the 4th parameter, if it is not set, the event will not be fired. 
It seems like an unexpected behavior, as this parameter is called 
formattingEnabled and based on its name it shouldn't affect BindingComplete 
event, but it does. */
txtAge.DataBindings.Add("Text", dataSource, "Name", true)
.BindingManagerBase.BindingComplete += BindingManagerBase_BindingComplete;

...

void BindingManagerBase_BindingComplete(
  object sender, BindingCompleteEventArgs e)
{
  if (e.Exception != null)
  {
    // this will show message to user, so it won't be silent anymore
    MessageBox.Show(e.Exception.Message); 
    // this will return value in the bound control to a previous correct value
    e.Binding.ReadValue();
  }
}
...