【问题标题】:The NotEmptyValidationRule control prevents input of a float numberNotEmptyValidationRule 控件防止输入浮点数
【发布时间】:2021-09-01 13:55:20
【问题描述】:

我有一个 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;
    }
}

Xaml 代码

<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>

我的视图模型

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

【问题讨论】:

  • 请注意:string.IsNullOrWhiteSpace(value?.ToString()) 比您当前的 string.IsNullOrWhiteSpace((value ?? "").ToString()) 更好阅读。

标签: c# wpf mvvm


【解决方案1】:

此类错误几乎总是与将TextBox.Text 绑定的Binding.UpdateSourceTrigger 设置为UpdateSourceTrigger.PropertyChanged 有关。
这个触发值几乎总是没有必要的。在“最佳”情况下,它会导致属性过于繁琐,如果设置属性还涉及引发事件或执行一般操作,情况会变得更糟。
在最坏的情况下,此触发器会使您的 TextBox 逻辑失败。
您几乎总是希望在输入完成后处理用户输入 - 这可能是在用户更正自己的输入错误之后)。这就是为什么 UpdateSourceTrigger.LostFocusTextBox.Text 绑定的默认值。

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

  1. 3
  2. 3.
  3. 3.3

由于您的属性类型是 float(而不是 string),因此在第 2 步输入“中断”):3. 不是有效的浮点数,将转换为 3,它将显示为如果.(小数分隔符)被拒绝。
可以测试Convert.ToDouble("3.")的结果,预计返回3

解决方案

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

【讨论】:

  • 非常好的解释和解决方案。我了解了问题的根源并找到了解决方案。谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-04-06
  • 2020-07-02
  • 1970-01-01
  • 2012-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多