我有一个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.LostFocus
是TextBox.Text
绑定的默认值。
由于UpdateSourceTrigger.PropertyChanged
的设置,在您的情况下,输入值3.3
分为三个属性分配:
3
3.
3.3
由于您的属性类型是float
(而不是string
),因此输入";3.
不是一个有效的浮点数,将被转换为3
,这将显示为如果.
(十进制分隔符)被拒绝。
您可以测试Convert.ToDouble("3.")
的结果,预计它将返回3
。
- 将
Binding.UpdateSourceTrigger
设置为更合理、性能更好的UpdateSourceTrigger.LostFocus
值(因为这是TextBox.Text
绑定的默认值,所以不要设置Binding.UpdateSourceTrigger
)。 - 定义
string
类型的属性SelectedSpeed