NotEmptyValidationRule控件防止输入浮点数



我有一个NotEmptyValidationRule类如下所示。如果我做Text="{Binding SelectedSpeed}"正常,我可以输入浮点数没有任何问题。

如果您检查NotEmptyValidationRule如下,则"."","正在阻塞输入。我不明白为什么会出现这个问题。

谢谢你的回答。

NotEmptyValidationRule.cs

public class NotEmptyValidationRule : ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
return string.IsNullOrWhiteSpace((value ?? "").ToString())
? new ValidationResult(false, "Field is required.")
: ValidationResult.ValidResult;
}
}
<<p>Xaml代码/strong>
<TextBox Width="150"
Margin="10,0,0,0"
TextWrapping="Wrap"
VerticalScrollBarVisibility="Auto">
<TextBox.Text>
<Binding Path="SelectedSpeed"
UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<local:NotEmptyValidationRule ValidatesOnTargetUpdated="True"/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>

My View Model

private float? _selectedSpeed;
public float? SelectedSpeed
{
get => _selectedSpeed;
set => SetProperty(ref _selectedSpeed, value);
}

这些错误几乎总是与将TextBox.Text绑定的Binding.UpdateSourceTrigger设置为UpdateSourceTrigger.PropertyChanged有关。
这个触发值几乎总是不必要的。在"最好"的情况下;如果设置属性还涉及引发事件或执行一般操作,则情况会变得更糟。
在最坏的情况下,这个触发器使您的TextBox逻辑失败。
您几乎总是希望在输入完成时处理用户输入(这可能是在用户纠正了自己的输入错误之后)。这就是为什么UpdateSourceTrigger.LostFocusTextBox.Text绑定的默认值。

由于UpdateSourceTrigger.PropertyChanged的设置,在您的情况下,输入值3.3分为三个属性分配:

  1. 3
  2. 3.
  3. 3.3

由于您的属性类型是float(而不是string),因此输入";3.不是一个有效的浮点数,将被转换为3,这将显示为如果.(十进制分隔符)被拒绝。
您可以测试Convert.ToDouble("3.")的结果,预计它将返回3

解决方案
  1. Binding.UpdateSourceTrigger设置为更合理、性能更好的UpdateSourceTrigger.LostFocus值(因为这是TextBox.Text绑定的默认值,所以不要设置Binding.UpdateSourceTrigger)。
  2. 定义string类型的属性SelectedSpeed

最新更新