Silverlight 3: UpdateSourceTrigger PropertyChanged – реализация отсутствующего функционала



В Silverlight 3 для UpdateSourceTrigger есть только занчения Default и Explicit.
Часто необходимо получить WPF поведение – UpdateSourceTrigger . PropertyChanged

Как это решается:
В лоб:
Вешаем на TextBox обраотчик TextChanged в котором передергиваем фокус на элементе. Стандартная фишка и работает без потери позиции курсора в Silverlight.

private void MyTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
    // чтоб работало вточности как при WPF UpdateSourceTrigger.PropertyChanged реагируем только если элемент под фокусом
    // Т.е. этим запретим установку фокуса при отркрытии
    if (FocusManager.GetFocusedElement() != sender)
    {
        return;
    }

    // здесь ставьте фокус на какой-то невидимый элемент или на RootVisual
    UiUtilsCommon.TrySetFocusOnRootVisual();

    var tb = sender as TextBox;

    // возвращаем фокус
    tb.Focus();
}

Как это решается по уму:
Создавайте в коде свой контрол, который наследует TextBox и подкллючите приведенный выше обработчик в конструкторе.

Для PasswordBox:
Для PasswordBox это проще решается в лоб через переопределение PasswordChanged, т.к. класс PasswordBox помечен как sealed. Можно, конечно, заморочиться на композитный контрол, но это лишнее.

private void MyPasswordBox_PasswordChanged(object sender, RoutedEventArgs e)
{
    if (FocusManager.GetFocusedElement() != sender)
    {
        return;
    }    UiUtilsCommon.TrySetFocusOnRootVisual();    var thisPasswordBox = sender as PasswordBox;    thisPasswordBox.Focus();
}Проблема. Когда возникает:
У вас есть список (дерево, грид и т.д.) элементов, а также детальная область, заполняемая биндингом по выбранному элементу и позволяющая редактировать выделенный элемент.
Производим изменение только в одном поле (TextBox) и, не убирая с него фокус, сразу выбираем другой элемент в списочном элементе.
В этом случае вы потеряете изменение, а также не сможете отреагировать и выполнить какую-то вашу важную логику.
При выборе другого элемента у вас уже отображаются другие данные.
При наступлении события выбора другого элемента биндинг по TextBox еще не отработал и новое значение поля в низлежащем объекте не будет задано.

Источник:
Textbox - how to update source object without losing focus?
Там есть и другие идеи.

Комментарии

Популярные сообщения из этого блога

A4tech. Мышь не найдена. Пожалуйста, подсоедините мышь.

SVN: Пропали иконки TortoiseSVN.

Вывод в cmd или bat пустой строки.