Привязка данных и выбрасывание исключения в установщике

StackOverflow https://stackoverflow.com/questions/880357

Вопрос

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

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), исключение в установщике будет проглочено, и я вообще ничего не смогу сделать, пока не исправлю значение в текстовом поле.Я имею в виду, что текстовое поле не сможет потерять фокус.Все происходит бесшумно - ошибок нет - вы просто ничего не можете сделать (даже закрыть форму или все приложение), пока не исправите значение.

Это похоже на ошибку, но вопрос в том,:каково обходное решение для этого?

Это было полезно?

Решение

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

Нам нужно обработать событие 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();
  }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top