В моем приложении 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 не переполнится.
Как я могу это исправить?