我不能在一个绑定到浮点属性的文本框中的点()'.'
之后写点()或零,而设置为。我知道这是因为绑定到浮点数据类型会自动导致 WPF 添加浮点验证器。我应该为我的浮动属性使用不同的或者编写我自己的验证器。但我不知道我该怎么做?有什么想法吗?.0
UpdateSourceTrigger
PropertyChanged
DataAnnotation
2 回答
这是一个常见的问题。您可以通过简单地将 a 添加StringFormat
到您的Binding
... 如果您想允许 2 位小数,您可以使用这个:
<TextBox Text="{Binding Value, StringFormat={}{##.##}, FallbackValue=0.00}" />
对于三位小数,您可以使用以下命令:
<TextBox Text="{Binding Value, StringFormat={}{##.###}, FallbackValue=0.00}" />
等等。
更新>>>
这太疯狂了……我确定那是我以前用过的,但现在似乎不起作用。我似乎找不到我原来的例子,但经过试验,我发现以下格式在某种程度上有效:
<TextBox Text="{Binding Value, StringFormat=N, FallbackValue=0.00}" />
<TextBox Text="{Binding Value, StringFormat=N2, FallbackValue=0.00}" />
<TextBox Text="{Binding Value, StringFormat=N3, FallbackValue=0.00}" />
我现在仍在寻找我原来的例子。
更新 2 >>>
不幸的是,我找不到我原来的例子......如果我能记得它在哪个应用程序中。然而,在网上快速搜索后,我发现了一个类似的帖子(Weird TextBox issues with .NET 4.5 - no '.'允许),我不久前回答了该帖子,并且该帖子具有相同的答案,似乎对该用户有效。
我完全接受这现在不起作用(对我们任何人来说),我不知道为什么,所以我只能为你提供我第一次更新中提供的三种格式。
添加 StringFormat=N2 会产生一些奇怪和不需要的行为
最简单的解决方案是将UpdateSourceTrigger=PropertyChanged更改为LostFocus
但是如果你真的想使用 PropertyChanged,可以使用额外的属性并绑定到它,如下所示:(在这种情况下,我对 ValueAddedTax 感兴趣,但我绑定到 ValueAddedTaxString)
private float valueAddedTax;
[Display(Name = "Value Added Tax")]
[Range(0, 100)]
public float ValueAddedTax
{
get { return valueAddedTax; }
set
{
SetProperty(ref valueAddedTax, value);
valueAddedTaxString = value.ToString();
}
}
private string valueAddedTaxString;
[NotMapped]
public string ValueAddedTaxString
{
get { return valueAddedTaxString; }
set
{
valueAddedTaxString = value;
if (!value.EndsWith("."))
{
float temp;
if (float.TryParse(value, out temp))
ValueAddedTax = temp;
}
}
}
如果你删除 "if (!value.EndsWith("."))" 它的行为与默认行为完全相同!!