В моем приложении WPF у меня есть TextBox, где пользователь может ввести процент (как int, от 1 до 100). Свойство Text привязано к свойству в ViewModel, где я устанавливаю значение в заданном диапазоне в установщике.
Однако в .NET 3.5 данные не отображаются должным образом в пользовательском интерфейсе после принудительной обработки. В этой публикации на MSDN Dr. WPF заявляет, что вам необходимо вручную обновить привязку, чтобы отобразить правильную. Поэтому у меня есть обработчик TextChanged
(в представлении), который вызывает UpdateTarget()
. В коде:
Просмотр XAML:
<TextBox Text="{Binding Percentage, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, TargetNullValue={x:Static sys:String.Empty}}"
TextChanged="TextBox_TextChanged"/>
Просмотреть код позади:
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 (и TextBox.Text отправителя равен «100»!), Но TextBox показывает 1004" . Если я затем введу «5», установщик получит значение «10045» и т. Д.
Если я затем введу «а», вдруг TextBox покажет правильное значение, то есть «100». То же самое происходит, если я продолжаю вводить числа до тех пор, пока int не переполнится.
Как я могу это исправить?