C# 使用不变量区域性绑定十进制值

C# 使用不变量区域性绑定十进制值,c#,wpf,binding,decimal,culture,C#,Wpf,Binding,Decimal,Culture,我有一个绑定到十进制属性的文本框 我们的要求是拥有一种不变性的文化行为 当用户键入6.30时,该值需要为6,30 如果用户键入6,30,则值需要为6,30 当前,当使用点时,绑定将值设置为630 这可能吗?您的需求实际上不是不变量文化的行为。您希望允许用户键入两种形式的数字,小数点可以是或,。这种动态表达式当然需要一些自定义的转换器。尝试此自定义转换器: public class MultiCultureNumberConverter : IValueConverter { public

我有一个绑定到十进制属性的
文本框

我们的要求是拥有一种不变性的文化
行为

当用户键入
6.30
时,该值需要为
6,30

如果用户键入
6,30
,则值需要为
6,30

当前,当使用点时,绑定将值设置为
630


这可能吗?

您的需求实际上不是
不变量文化的行为。您希望允许用户键入两种形式的数字,小数点可以是
。这种动态表达式当然需要一些自定义的转换器。尝试此自定义转换器:

public class MultiCultureNumberConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, 
                          System.Globalization.CultureInfo culture)
    {
        var ci = System.Globalization.CultureInfo.InvariantCulture.Clone() 
                 as System.Globalization.CultureInfo;
        ci.NumberFormat.NumberDecimalSeparator = ",";
        return ((decimal)value).ToString(ci);
    }

    public object ConvertBack(object value, Type targetType, object parameter, 
                              System.Globalization.CultureInfo culture)
    {
        var ci = System.Globalization.CultureInfo.InvariantCulture.Clone() as 
                 System.Globalization.CultureInfo;
        var s = System.Convert.ToString(value);
        decimal d;
        if (decimal.TryParse(s, System.Globalization.NumberStyles.Number 
                  ^ System.Globalization.NumberStyles.AllowThousands, ci, out d))
        {
            return d;
        }
        else
        {
            ci.NumberFormat.NumberDecimalSeparator = ",";
            if (decimal.TryParse(s, System.Globalization.NumberStyles.Number 
                ^ System.Globalization.NumberStyles.AllowThousands, ci, out d)) 
              return d;
        }
        return Binding.DoNothing;
    }
}

我在这方面遇到了很多问题,所以我大部分时间都是自己检查,最简单的方法是在textbox上为textchanged订阅一个事件,然后执行以下操作textbox1.Text=textbox1.Text.Replace('.',',')@Vajura-如果有人分别输入
123456.78
123.456,78
(在不同的文化中都是
123456.78
),该怎么办?@Vajura这对我来说是不可能的,因为我使用WPF绑定。它的工作方式与winforms完全不同。有了它(),我希望它能在
6.30
中正常工作(如:类似预期),但现在
6,30
不会变成
630
?看起来OP正在寻找一种方法来使用两个不同的十进制分隔符,据我所知,这并不容易。我得到一个
名称“CultureInfo”不存在于名称空间“clr名称空间:System.Globalization;assembly=System.Globalization”
error@Corak你说得对,我只是太专注于他的要求,将区域设置为
不变量区域
,而在这种区域中,它应该始终显示
。@DeMama不确定怎么会出现这样的错误,我先尝试了我这边的代码。无论如何,这确实设置了区域性,但对您的需求没有帮助(总是将
显示为
)。非常好@KingKing!谢谢