Наконец я прибыл в Минск. Через полтора часа у меня встреча и большая надежда на Интернет. Уже сейчас узнал, что анонс SilverLight 3 таки состоялся и даже появилась документация (вы не поверите, но у меня ее еще нет). Была слабая надежда на то, что тут есть платный зал ожидания. Он таки есть, но туда лучше не ходить. В обычном зале ожидания стулья железные и холодные. Ничего, я слышал, что теплые вредно, а холодные не дадут заснуть. Пишем дальше:)
Проверка данных при связывании
Рассмотрим небольшой пример. Для этого опишем простой класс Employee с двумя полями:
public class Employee { private string firstName;
public string FirstName { get { return firstName; } set { if (!value.Equals("Sergey")) { throw new Exception("First Name must be Sergey!"); } firstName = value; } } private string lastName;
public string LastName { get { return lastName; } set { lastName = value; } }
public Employee(string fName, string lName) { this.FirstName = fName; this.LastName = lName; } }
А также опишем форму, которая связана с объектом типа Employee
<StackPanel x:Name="LayoutRoot" Background="White" Loaded="LayoutRoot_Loaded"> <TextBox Width="100" Text="{Binding FirstName, Mode=TwoWay}"></TextBox> <TextBox Width="100" Text="{Binding LastName, Mode=TwoWay}"></TextBox> </StackPanel>
И код:
Employee emp;
private void LayoutRoot_Loaded(object sender, RoutedEventArgs e) { emp = new Employee("Sergey","B"); LayoutRoot.DataContext = emp; }
Как видно из реализации класса Employee, в качестве имени может быть установленно только Sergey. В SilverLight 3 есть два хороших механизма по обработке ошибок при связывании с данными.
Первый механизм, это специальный элемент управления, который будет нотифицировать пользователя об ошибке связывания. Для этого внесем небольшие изменения в описание TextBox.
<TextBox Width="100" Text="{Binding FirstName, Mode=TwoWay, ValidatesOnExceptions=true}"></TextBox>
Мы добавили простое свойство ValidatesOnException. Чтобы посмотреть на его работу, запустите приложение и введите неверные данные. Поле ввода будет выделено красной рамкой, а при наведении фокуса Вы увидете сообщение, которое заключено в исключении.
Второй механизм позволяет написать код в ответ на исключение при связ��вании. Для этого изменим TextBox следующим образом:
<TextBox Width="100" Text="{Binding FirstName, Mode=TwoWay, ValidatesOnExceptions=true, NotifyOnValidationError=true}" BindingValidationError="TextBox_BindingValidationError" x:Name="textBox1"></TextBox>
Тут мы описали обработчик специального события BindingValidationError, а также указали свойство NotifyOnValidationError, которое говорит о необходимости генерации этого события.
А вот и код обработчика:
private void TextBox_BindingValidationError(object sender, ValidationErrorEventArgs e) { textBox1.Focus(); }
Тут мы просто устанавливаем фокус на наше поле, чтобы дополнительно пивлечь внимание пользователя и заставить его исправить ошибку.
Все, холод таки вреден. А тут еще и снегопад жуткий. Может и не доберусь уже до Интернета, никогда.... Попробую выпить кофе и пойти на встречу. Продолжение следует.