双向绑定的文本框(double)不允许使用小数点分隔符。

4

我有一个文本框:

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

在viewModel中:
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。现在我想制作一个加载按钮,但不是将值写入文本框,而是只需设置视图模型中的参数并使用双向绑定。但是,当我将绑定模式更改为TwoWay时,文本框不再接受小数分隔符(,或.)。当我尝试输入7.0时,它只显示70。

我尝试在文本框上使用字符串格式,这样它就允许使用分隔符,但是当我尝试输入类似于7.0的东西时,它变成了7.0.0

如何解决这个问题?


1
TextBox.Text 默认情况下是字符串类型,尝试使用转换器将其转为双精度。 - Maximus
你能给我一个例子吗?我已经尝试了几个转换器,但没有成功。 - user3692104
2个回答

1

对于您的绑定,尝试添加延迟。我使用300,您可以使用任何数字。这似乎对我的应用程序有所帮助。

例如:

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

0
当你将绑定设置为double时,它会自动调用.ToString()方法,因此无需使用转换器来在TextBox.Text中显示其值。不幸的是,它不允许像你描述的那样输入'.'或','。我有几个解决方案:
  1. 正如你所说,你可以使用StringFormat,在这种情况下,StringFormat={}{0:0.0}},但是你只能写7,而不能写7.0或者改变小数点后的数字。
  2. 第二种方法是将属性的类型从Double更改为string。然后允许输入',',但是每次想要使用它时,你都需要将其转换为double。
  3. 我已经找到了一个可用的解决方案,请看这里

昨天我通过将我的属性更改为字符串来解决了这个问题,对于这个应用程序来说这不是什么大问题,因为我要将属性提供给XML,所以无论如何都必须将它们转换为字符串,但是对于未来的使用,我希望有一个更好的解决方案。感谢您的建议。 - user3692104

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接