Принуждение WPF TextBox больше не работает в .NET 4.0
В моем приложении WPF у меня есть TextBox, где пользователь может ввести процент (как int, от 1 до 100). Свойство Text является привязкой к привязке к свойству в ViewModel, где я принуждаю значение в заданном диапазоне в настройщике.
Однако в .NET 3.5 данные не отображаются должным образом в пользовательском интерфейсе после принудительного ввода. В этом сообщении на MSDN д-р WPF заявляет, что вам нужно вручную обновить привязку, чтобы было показано правильное. Поэтому у меня есть обработчик TextChanged
(в представлении), который вызывает UpdateTarget()
. В коде:
Просмотр XAML:
- Можно ли связать свойство Canvas's Children в XAML?
- Связывание в WPF с элементом массива, заданным свойством
- WPF привязка к локальной переменной
- Заполнить Combobox из базы данных
- Есть ли способ определить, где объявляется / создается привязка WPF?
Просмотр кода:
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 не переполнится.
Как я могу это исправить?
- Image UriSource и привязка данных
- Обнаружение ошибок проверки WPF
- Как я могу привязать данные строк к ListBox в WPF / WP7?
- Связывающие свойства в коде
- Нажатие свойств GUI только для чтения обратно в ViewModel
- ItemsControl с несколькими DataTemplates для viewmodel
- Управление несколькими выборами с помощью MVVM
- Должен ли я привязываться к ICollectionView или ObservableCollection
Попробуйте использовать в 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 (или событий). Он будет работать по своему желанию.