Как проверить значение без обновления цели привязки? - PullRequest
0 голосов
/ 15 марта 2012

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

public static void PreviewTextChanged(
    object sender,
    PreviewTextChangedEventArgs e)
{
    var textBox = e.Source as TextBox;
    var bindingExpression = textBox.GetBindingExpression(TextBox.TextProperty);
    if (!ReferenceEquals(null, bindingExpression))
    {
        // save original parameters for possible restoration
        var originalSelectionStart = textBox.SelectionStart;
        var originalSelectionLength = textBox.SelectionLength;
        var originalText = textBox.Text;

        // check validation
        textBox.Text = e.Text;
        if (!bindingExpression.ValidateWithoutUpdate())
        {
            // restore original values
            textBox.Text = originalText;
            bindingExpression.UpdateSource();
            textBox.SelectionStart = originalSelectionStart;
            textBox.SelectionLength = originalSelectionLength;
        }
        else
        {
            // correct the selection
            var selectionStart = originalSelectionStart +
                originalSelectionLength +
                e.Text.Length -
                originalText.Length;
            textBox.SelectionStart = Math.Max(selectionStart, 0);
            textBox.SelectionLength = 0;
        }

        e.Handled = true;
    }
}

Код выше работает.Но было бы намного проще и менее подвержено ошибкам, если бы я мог найти способ проверить, является ли новое значение допустимым, не обновляя цель привязки.Есть ли один?

1 Ответ

0 голосов
/ 15 марта 2012

Я думаю, что в этом случае проще включить Binding Converters . converter будет вызываться каждый раз, когда данные должны быть назначены для связанного поля. Внутри этого метода вы можете проверить ввод данных и на основе возврата результата проверки или старых данных (причина сбоя проверки) восстановлена ​​из ModelView или принять ее, если проверка прошла успешно.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...