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

String To Double Converter with IValueConverter C#

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

我已将其应用到我的 UserControl.Resources 标签中

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

并创建了一个新的 class 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) 是否正确?

您不需要 StringToDoubleConverter。

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