TextBox绑定到double并输入小于-1的负数时的问题

时间:2014-06-15 13:30:58

标签: c# wpf

将文本框绑定到Propery并输入小于-1的负数时出现问题 - 例如-0.45:

文本框:

<TextBox Text="{Binding Txt, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

和财产:

  double txt;
    public double Txt
    {
        get { return txt; }
        set { txt = value; OnPropertyChanged("Txt"); }
    }

似乎当我尝试输入-0.54时,它立即变为0,为什么?

2 个答案:

答案 0 :(得分:5)

这是完成工作的转换器(因此,请保留您的视图模型 - 您可以将它用于十进制和双精度)。我们最初需要保持小数和-ve位置:

 public class DecimalConverter:IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value !=null)
        {
            return value.ToString();
        }
        return Binding.DoNothing;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string data = value as string;
        if (data == null)
        {
            return value;
        }
        if (data.Equals(string.Empty))
        {
            return 0;
        }
        if (!string.IsNullOrEmpty(data))
        {
            decimal result;
            //Hold the value if ending with .
            if (data.EndsWith(".") || data.Equals("-0"))
            {
                return Binding.DoNothing;
            }
            if (decimal.TryParse(data, out result))
            {
                return result;
            }
        }
        return Binding.DoNothing;
    }
}

因此,我们持有值或在绑定上不做任何事情

答案 1 :(得分:1)

当你输入十进制值时,它再次变为0,所以最好的方法是使用lostfocus触发器:

 <TextBox Text="{Binding Txt, Mode=TwoWay, UpdateSourceTrigger=LostFocus}"  Grid.Row="0"/>

您还需要在视图模型中执行此操作:

public double Txt
    {
        get { return txt; }
        set
        {
            if (!txt.Equals(value))
            {

                txt = value;
                OnPropertyChanged("Txt");
            }
        }
    }