Я использую пользовательский TextBox, и он принимает двойное значение, на которое я применил некоторые проверки, он отлично работает, но когда я нажимаю BackSpace, он также удаляет десятичную точку, которая раздражает. Например, если текущее значение равно "2,5", и я нажимаю "назад", ".5" удаляется, тогда как требуемое значение должно быть "2.".
Вот xaml моего пользовательского TextBox, который используется в UserControl
<rmguiutil:RMTextBox Margin="5,5,0,0" Width="40" HorizontalAlignment="Left" OnlyAllow="Double"
Text="{Binding StartConcentration, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, NotifyOnValidationError=True}"
IsEnabled="{Binding IngredientIngredientTypeRow, Converter={StaticResource GlobalNullObjectToBooleanConverter}, FallbackValue=False}" />
Вот код для моего пользовательского TextBox, я переопределил его событие PreviewTextInput
protected override void OnPreviewTextInput( System.Windows.Input.TextCompositionEventArgs e )
{
base.OnPreviewTextInput( e );
if( OnlyAllow == RMTextBoxOnlyAllow.Double && ( e.Text.Any( c => !Char.IsDigit( c ) && c != '.' ) || ( e.Text.Count( c => c == '.' ) + Text.Count( c => c == '.' ) ) > 1 ) )
e.Handled = true;
else if( OnlyAllow == RMTextBoxOnlyAllow.Integer && e.Text.Any( c => !Char.IsDigit( c ) ) )
e.Handled = true;
}
Я не мог найти решения по моей проблеме.
UpdateSourceTrigger
of Binding StartConcentration
устанавливается в PropertyChanged
, что означает, что он будет проверять каждый раз при изменении значения. LostFocus
было бы лучше.
double.TryParse()
вернетfalse
прямо во время редактирования; 2) когда пользователь подтверждает свой ввод (фокус потерян?double.TryParse()
Enter
?), Вы снова делаетеdouble.TryParse()
и если значение недействительно, то просто не меняйте исходное.