【问题标题】:String To Double Converter with IValueConverter C#使用 IValueConverter C# 的字符串到双倍转换器
【发布时间】:2019-05-30 00:40:12
【问题描述】:

我有一个视图,我应该可以在其中输入双打。问题是,我只能输入诸如“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}}"/>

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

private double _delayTime;

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

我知道我的转换器出了点问题。我正在努力获得正确的代码来将我想在我的视图中输入的字符串转换为双精度。

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

【问题讨论】:

  • 您的电脑设置为哪种文化?它是否使用句点作为小数点?
  • 我是德国人。我想用“。”或“,”表示小数点。任何一个都可以。但现在我无法进入其中任何一个。我可以做的是:输入:“1”然后用左箭头键写一个“.”,程序会自动在前面放一个0。它现在显示“0.1”并且可以正常工作。但这不是很直观......
  • 您的问题是使用 UpdateSourceTrigger=PropertyChanged。它在按下每个键后更新源。如果您放置点字符,它将使用字符串值“0”更新源。什么让你毫无意义地返回“0”。您可以在按 Enter 时将 UpdateSourceTrigger 更改为 Default 并手动更新 Source。
  • 一个应该工作,另一个失败。并非两者都失败。如果您想要机器人工作,那么我们 TryParse 并且当一个失败时,然后使用不同的文化并尝试第二个。或者使用字符串方法将句点/逗号更改为其他。
  • 你可以试试这个decimal.TryParse(stringNumber, NumberStyles.Any, CultureInfo.InvariantCulture out decimal val)CultureInfo.InvariantCulture 将处理十进制字符,无论它是什么。

标签: c# string double ivalueconverter converters


【解决方案1】:

您不需要 StringToDoubleConverter。

问题在于使用 UpdateSourceTrigger=PropertyChanged。它在按下每个键后更新源。如果您放置点字符,它将使用字符串值“0”更新源。什么让你毫无意义地返回“0”。当您使用 KeyDown 事件按 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();
    }

【讨论】:

  • 谢谢斯特凡! Key.Enter-Method 真的很有帮助。
猜你喜欢
  • 2014-06-27
  • 2011-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-15
  • 2015-08-06
  • 1970-01-01
  • 2014-06-20
相关资源
最近更新 更多