使用IValueConverter C#的字符串到双转换器

时间:2019-01-03 12:10:35

标签: c# string double ivalueconverter converters

我有一个View,可以在其中输入double。问题是,我只能输入整数,例如“ 100”,而不能输入“ 100.4”。我所有的背景计算都是双打。 我现在正在尝试通过实现StringToDoubleConverter来绕过该问题,但是我的C#知识仍然非常有限。

我已经在我的UserControl.Resources标签中实现了

<local:StringToDoubleConverter x:Key="StringToDouble"/>

并创建了一个新的StringToDoubleConverter类:

class StringToDoubleConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            string stringNumber = value as string;
            double.TryParse(stringNumber, out double val);
            return val;
        }
    }

最后,我已将转换器实现到我的绑定中:

<TextBox Text="{Binding RelativeSource={RelativeSource AncestorType=UserControl}, Path=DelayModel.DelayTime, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource StringToDouble}}"/>

我的DelayTime中的DelayModel看起来像这样:

private double _delayTime;

public double DelayTime
{
    get
    {
        return _delayTime;
    }
    set
    {
        if (value != _delayTime)
        {
            _delayTime = value; NotifyPropertyChanged();
        }
    }
}

我知道我的转换器有问题。我正在努力获取正确的代码,以将要在视图中输入的字符串转换为双精度。

例如:我想在视图中输入“ 0.7”,而DelayTime实际上应该得到“ 0.7”,而不仅仅是“ 7”。 TryParse oder double.Parse(value)是否正确?

1 个答案:

答案 0 :(得分:1)

您不需要StringToDoubleConverter。

问题是使用UpdateSourceTrigger = PropertyChanged。按下每个键后将更新源。如果放置点字符,它将使用字符串值“ 0”更新源。是什么让您毫无意义地返回“ 0”。您可以将KeySource事件按下Enter时将UpdateSourceTrigger更改为Default并手动更新Source

<TextBox Text="{Binding RelativeSource={RelativeSource AncestorType=UserControl}, Path=DelayModel.DelayTime}" KeyDown="TextBox_KeyDown"/>

和后面的代码

private void TextBox_KeyDown(object sender, KeyEventArgs e)
    {
        if(e.Key == Key.Enter)
            (sender as TextBox).GetBindingExpression(TextBox.TextProperty).UpdateSource();
    }