3

我不能在一个绑定到浮点属性的文本框中的点()'.'之后写点()或零,而设置为。我知道这是因为绑定到浮点数据类型会自动导致 WPF 添加浮点验证器。我应该为我的浮动属性使用不同的或者编写我自己的验证器。但我不知道我该怎么做?有什么想法吗?.0UpdateSourceTriggerPropertyChangedDataAnnotation

4

2 回答 2

1

这是一个常见的问题。您可以通过简单地将 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 '.'允许),我不久前回答了该帖子,并且该帖子具有相同的答案,似乎对该用户有效。

我完全接受这现在不起作用(对我们任何人来说),我不知道为什么,所以我只能为你提供我第一次更新中提供的三种格式。

于 2013-10-23T09:55:19.073 回答
1

添加 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("."))" 它的行为与默认行为完全相同!!

于 2015-07-02T10:20:38.907 回答