Принуждение 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  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» и т. Д.

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

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

Попробуйте использовать в xaml Explicit вместо PropertyChanged:

  

и в коде вместо UpdateSource вместо UpdateTarget

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

Протестировано, и это работает. Btw эта проблема, вероятно, будет решена в более поздней версии .NET.

Вы можете использовать PropertyChanged. Однако попробуйте привязать к зависимостям EditValueProperty вместо зависимости TextProperty (или событий). Он будет работать по своему желанию.

  • Когда следует использовать # и = в элементах управления ASP.NET?
  • Какие подходы доступны для фиктивных данных времени разработки в WPF?
  • Привязка OneWayToSource от свойства readonly в XAML
  • WPF перед записью
  • Привязка данных Android с использованием тега include
  • Похоже, что привязки данных не обновляются
  • Связывание Richtextbox wpf
  • Связывание WPF ComboBox с пользовательским списком
  • ElementName привязка из MenuItem в ContextMenu
  • Как правильно привязать xml к WPF DataGrid?
  • WPF привязка данных к интерфейсу, а не к фактическому объекту - возможность литья?
  • Interesting Posts
    Давайте будем гением компьютера.