在WPF 4.0中无法正确显示双值

时间:2015-11-03 12:11:51

标签: c# .net wpf .net-4.0

我们在应用程序中有一个显示double值的文本框。此文本框连接到转换器,该转换器接收字符串,将其转换为double并将其舍入到2个小数位。然后,同一转换器将double转换回字符串并将其传递回视图。

现在我们面临的问题。问题是,四舍五入是按预期工作的,但是四舍五入不起作用。例如,如果我们在文本框中放置1.229,它会自动将其舍入到1.23,而如果我们将1.224放在它上面,则不会将其舍入到1.22

我更深入地研究了这个问题,发现实际的舍入工作正常,但是当舍入值传递给视图时,过程中似乎存在问题。 为了解释一下我的发现,如果我在Math.Round上设置一个断点,它返回的结果是预期的结果。但是当相同的值返回到视图时,由于某种原因,值会更改,并且文本框中显示的内容不是预期的值。

我将项目框架更改为4.5,发现.NET Framework 4.5中不存在此问题,一切都按预期工作。但我们正在使用.NET Framework 4.0并需要一种解决方法。

转换器代码:

public class TextToNumberConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string result = string.Empty;

        int decimalsValue = 2;
        if (parameter != null)
        {
            Int32.TryParse(parameter.ToString(), out decimalsValue);
        }

        if (!double.IsNaN(System.Convert.ToDouble(value)))
        {
            result = string.Format("{0}", Math.Round((double)value, decimalsValue, MidpointRounding.AwayFromZero));
        }

        return result;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string inVal = (string)value;

        switch (targetType.Name)
        {
            case "Int32":
                return this.StringToInt32(inVal);
            case "Double":
                if (inVal != String.Empty &&
                inVal != "-" &&
                inVal != "-0" &&
                inVal != "-0," &&
                inVal != "-0." &&
                inVal != "-0,0" &&
                inVal != "-0.0")
                {
                    return this.StringToDouble(inVal);
                }
                else
                    return Double.NaN;
            default:
                return 0;
        }
    }

    private int StringToInt32(string inVal)
    {
        int retVal = 0;

        // remove non-integer characters
        //string regExpressionPattern = "[^0-9-]";
        //inVal = Regex.Replace(inVal, regExpressionPattern, String.Empty);

        bool result = Int32.TryParse(inVal, out retVal);
        if (true == result)
        {
            return retVal;
        }
        else
        {
            return 0;
        }
    }

    private double StringToDouble(string inVal)
    {
        double retVal = double.NaN;

        // remove non-numeric characters
        //string regExpressionPattern = "[^0-9-.,]";
        //inVal = Regex.Replace(inVal, regExpressionPattern, String.Empty);
        inVal = Regex.Replace(inVal, "[,]", CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator);

        bool result = Double.TryParse(inVal, NumberStyles.Float, CultureInfo.InvariantCulture.NumberFormat, out retVal);
        if (true == result)
        {
            return retVal;
        }
        else
        {
            return double.NaN;
        }
    }
}

查看型号:

public class MainWindow_ViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    private RxData _currentRxData_right;
    public RxData CurrentRxData_right
    {
        get
        {
            if (_currentRxData_right == null)
                _currentRxData_right = new RxData();

            return _currentRxData_right;
        }
        set
        {
            _currentRxData_right = value;
            PropertyChanged(this, new PropertyChangedEventArgs("CurrentRxData_right"));
        }
    }
}

型号代码:

public class RxData
{
   public double Sphere { get; set; }
}

数据输入的文本框:

<TextBox x:Name="txt_sph" Text="{Binding CurrentRxData_right.Sphere, Converter={StaticResource TextToNumber}, Mode=TwoWay, StringFormat=\{0:F2\}, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, TargetNullValue=NULL}" ></TextBox>

1 个答案:

答案 0 :(得分:0)

减少0.005的好老把手就可以完成这项工作:

  • 1.224 - 0.005 = 1.219 == Round =&gt; 1.22。
  • 1.229 - 0.005 = 1.224 == Round =&gt; 1.23。