我有一个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)是否正确?
答案 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();
}