Jaa


SilverLight 3: Что нового? (часть 3)

Наконец я прибыл в Минск. Через полтора часа у меня встреча и большая надежда на Интернет. Уже сейчас узнал, что анонс 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. Чтобы посмотреть на его работу, запустите приложение и введите неверные данные. Поле ввода будет выделено красной рамкой, а при наведении фокуса Вы увидете сообщение, которое заключено в исключении.

image

Второй механизм позволяет написать код в ответ на исключение при связывании. Для этого изменим 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();
}

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

Все, холод таки вреден. А тут еще и снегопад жуткий. Может и не доберусь уже до Интернета, никогда.... Попробую выпить кофе и пойти на встречу. Продолжение следует.

Comments