Принуждение WPF TextBox больше не работает в .NET 4.0

В моем приложении WPF у меня есть TextBox, где пользователь может ввести процентное значение (как int, от 1 до 100) . Свойство Text привязано к свойству в ViewModel, где я заставляю значение находиться в заданном диапазоне в установщике.

Однако в .NET 3.5 данные не отображаются должным образом в пользовательском интерфейсе после принуждения. В этой публикации на MSDN доктор WPF заявляет, что вам необходимо вручную обновить привязку, чтобы отображалась правильная. Поэтому у меня есть обработчик TextChanged (в представлении), который вызывает UpdateTarget () . В коде:

Просмотреть XAML:


Просмотреть скрытый код:

private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
    // Removed safe casts and null checks
    ((TextBox)sender).GetBindingExpression(TextBox.TextProperty).UpdateTarget();
}

ViewModel:

private int? percentage;
public int? Percentage
{
    get
    {
        return this.percentage;
    }

    set
    {
        if (this.Percentage == value)
        {
            return;
        }

        // Unset = 1
        this.percentage = value ?? 1;

        // Coerce to be between 1 and 100.
        // Using the TextBox, a user may attempt setting a larger or smaller value.
        if (this.Percentage < 1)
        {
            this.percentage = 1;
        }
        else if (this.Percentage > 100)
        {
            this.percentage = 100;
        }
        this.NotifyPropertyChanged("Percentage");
    }
}

К сожалению, этот код не работает в .NET 4.0 (тот же код просто изменил TargetFramework на 4.0). В частности, после того, как я ввел значение в первый раз, TextBox игнорирует любые дальнейшие принудительные значения, пока я продолжаю вводить целочисленные значения (поскольку я привязываюсь к int).

Итак, если я введу «123», после 3 я вижу значение «100». Теперь, если я ввожу «4», установщик в ViewModel получает значение «1004», которое он переводит в 100. Затем запускается событие TextChanged (и отправитель ' s TextBox.Text - «100»!), но TextBox показывает «1004». Если я затем введу «5», установщик получит значение «10045» и т. Д.

Если я затем введу «а», текстовое поле внезапно покажет правильное значение, то есть «100». То же самое происходит, если я продолжаю вводить числа до тех пор, пока int не переполнится.

Как я могу это исправить?

6
задан Azhar 9 November 2010 в 07:11
поделиться