C# 将双精度值绑定到textbox

C# 将双精度值绑定到textbox,c#,C#,我有一个ObservableCollection填充数据网格DGCommands,一些文本框的Text属性定义如下: Text="{Binding SelectedItem.Costs, Mode=TwoWay, ElementName=DGCommands, UpdateSourceTrigger=PropertyChanged}" 好的,现在当我从一个文本框中解析一个双精度值时,例如: bool costs_valid = double.TryParse(txtboxCosts.Text,

我有一个
ObservableCollection
填充数据网格
DGCommands
,一些文本框的
Text
属性定义如下:

Text="{Binding SelectedItem.Costs,
Mode=TwoWay,
ElementName=DGCommands,
UpdateSourceTrigger=PropertyChanged}"
好的,现在当我从一个文本框中解析一个双精度值时,例如:

bool costs_valid = double.TryParse(txtboxCosts.Text, out _costs) // 1,8 i get 18;
我试图用这种方法解决问题,但我不确定这是否是最好的解决方案:

public static double DoubleParseCostum(string val)
{
        double res = 0;
        bool res_valid = double.TryParse(val, out res);
        if (val.ToString().Contains(_DECIMAL_)) return res;
        else
        {
            if ("." != _DECIMAL_ && val.Contains(".")) return double.Parse(val.Replace(".", _DECIMAL_));
            if ("," != _DECIMAL_ && val.Contains(",")) return double.Parse(val.Replace(",", _DECIMAL_));
        }
        return res;
}
在哪里

_DECIMAL_ = Convert.ToChar(System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator).ToString();
编辑:


将标题从“Parsing string to double gives Int”更改为当前标题,因为真正的问题在于绑定,而不是解析,因为当我想将1.8更改为1.8时,由于失去焦点,我得到了18。请尝试以下操作:
double.Parse(“1.8”,CultureInfo.InvariantCulture)
在本例中,我选择了一种文化(奥地利)它使用逗号作为十进制分隔符来显示如何执行此操作。当然,您可以将区域性设置为您想要的任何内容,包括当前的UI区域性

var testCulture = CultureInfo.CreateSpecificCulture("de-AT");
var text = "1,8";
double result;
var ok = double.TryParse(text, NumberStyles.Float, testCulture, out result);
Console.WriteLine("And the result is: {0:000.0000}", result);
输出:

And the result is: 001.8000

这是一个很长的机会。。。我想知道您实际上试图解决的潜在问题(没有意识到)是否是所有WPF应用程序都默认使用“en-US”语言环境。您可以在应用程序启动时通过执行以下操作来解决此问题:

FrameworkElement
   .LanguageProperty
   .OverrideMetadata(
    typeof(FrameworkElement),
    new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentUICulture.IetfLanguageTag)));

我终于找到了一个解决方案,正如@Richardissimo所说,WPF默认使用“en-US”文化,逗号(,)被视为千位分隔符,而不是小数点。因此,我将ConverterCulture属性设置为使用系统的默认区域性:

<TextBox Name="txtboxCosts" Style="{StaticResource txtboxDefault2}"
xmlns:gl="clr-namespace:System.Globalization;assembly=mscorlib"                       
Text="{Binding SelectedItem.proCosts, 
       Mode=TwoWay,   
       ElementName=DGCommands,
       StringFormat={}{0:N2},
       UpdateSourceTrigger=PropertyChanged,
       ConverterCulture={x:Static gl:CultureInfo.CurrentCulture}}"/>


我想将十进制字符保留为任意Culture@Mugiwara祝你好运,但你没抓住重点(笑)。不同的文化使用不同的字符来表示不同的事物。例如,有时“.”表示千个分隔符,有时表示小数点。也许CultureInfo.CurrentCulture可以?你试过我的建议了吗?您的方法要求您在每个绑定中加入转换器文化。我的建议只要求您在一个位置添加一行代码,以使整个应用程序正常工作,而无需进行其他更改,并且它将适用于应用程序用户使用的任何文化。不是真的^^“我直到现在才明白,它太完美了。非常感谢你,感谢你再次指出,尽管我说我找到了解决方案,但你为我节省了很多时间,我真的很感激:完美谢谢你:D