具有双向数据绑定(双精度)的TextBox不允许使用十进制分隔符

本文关键字:不允许 TextBox 分隔符 十进制 数据绑定 双精度 | 更新日期: 2023-09-27 18:21:23

我有以下文本框:

<TextBox x:Name="VoorzieningBerging"
         HorizontalAlignment="Right" TextChanged="SimulatieWijziging"
         Margin="0,0,45,0" Width="60" Height="25">
    <TextBox.Text>
        <Binding Path="VoorzieningParameters[0].Double"
                 ValidatesOnDataErrors="True" UpdateSourceTrigger="PropertyChanged"
                 FallbackValue="0" Mode="OneWayToSource">
            <Binding.ValidationRules>
                <src:DoubleValidation/>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

在视图中模型:

VoorzieningParameters = new ObservableCollection<Parameter>();
VoorzieningParameters.Add(new Parameter() { Naam = "berging" });

其中,Parameter是一个具有描述(Naam)和值的双精度的类。

public class Parameter
{
    public Parameter()
    {
    }
    public string Naam { get; set; }
    public double? Double { get; set; }
}

这很好,我在文本框中输入数据,当我点击保存按钮时,我循环浏览ObservableCollection中的所有"参数",并将它们写入XML。然而,现在我想制作一个加载按钮,但我不想将值写入文本框,而是只想在视图模型中设置Parameters,并使用TwoWay绑定。然而,当我将绑定模式更改为TwoWay时,Textbox不再接受十进制分隔符(,或.)。当我尝试输入7.0时,它只显示70。

我试过在文本框中使用字符串格式,然后它允许使用分隔符,但当我尝试输入7.0之类的内容时,它变成了7.0.0

我该如何解决这个问题?

具有双向数据绑定(双精度)的TextBox不允许使用十进制分隔符

对于绑定,请尝试添加延迟。我用300,你可以用任何数字。这似乎对我的应用程序起到了作用。

例如:

    <Binding Path="VoorzieningParameters[0].Double"
                     ValidatesOnDataErrors="True" UpdateSourceTrigger="PropertyChanged"
                     Delay=300
                     FallbackValue="0" Mode="OneWayToSource">

当您将绑定设置为双倍时,它会自动调用.ToString(),因此不需要使用Converter在TextBox.Text中显示其值。遗憾的是,它不允许放置"."或者如你所描述的","。我有两个解决方案

  1. 正如您所说,您可以按如下方式使用StringFormat,StringFormat={}{0:0.0}},但您不能写7.0,只能写7或更改点后的数字
  2. 第二种方法是将属性的类型从Double更改为string。然后输入","是允许的,但无论何时您都必须将其强制转换为双精度
  3. 我遇到了现有的解决方案,请查看此处