C# 将字符串格式设置为';D';第一次需要按两次键才能将数据输入文本框wpf

C# 将字符串格式设置为';D';第一次需要按两次键才能将数据输入文本框wpf,c#,wpf,xaml,data-annotations,idataerrorinfo,C#,Wpf,Xaml,Data Annotations,Idataerrorinfo,这是我的文本框xaml <TextBox HorizontalAlignment="Left" TextWrapping="NoWrap" Text="{Binding Path=PointChangeRate,UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True,TargetNullValue='', StringFormat=D}" VerticalAlignment="Center" Margin="10" G

这是我的文本框xaml

<TextBox HorizontalAlignment="Left" TextWrapping="NoWrap" Text="{Binding Path=PointChangeRate,UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True,TargetNullValue='', StringFormat=D}" VerticalAlignment="Center" Margin="10" Grid.Column="1" Grid.Row="1" Width="160" Height="24"/>

这是我在视图中的属性模型

[Required(ErrorMessage = "PointChangeRate is Required")]
[RegularExpression("^[0-9]{1,5}([.][0-9]{1,5})?$", ErrorMessage = "PointChangeRate cannot have more than 5 decimal points")]
[CustomValidate(GroupID = "PointCalculationSettings")]
public Nullable<double> PointChangeRate
{
    get
    {
        return this._trackingConfig.PointChangeRate;
    }
    set
    {                               
        this._trackingConfig.PointChangeRate = value;
        OnPropertyChanged("PointChangeRate");
    }
}
[必需(ErrorMessage=“PointChangeRate是必需的”)]
[RegularExpression(“^[0-9]{1,5}([.][0-9]{1,5})?$”,ErrorMessage=“PointChangeRate不能有超过5个小数点”)]
[CustomValidate(GroupID=“PointCalculationSettings”)]
公共可空点更改率
{
得到
{
返回此值。_trackingConfig.PointChangeRate;
}
设置
{                               
此参数为._trackingConfig.PointChangeRate=值;
OnPropertyChanged(“PointChangeRate”);
}
}
问题是视图模型中的属性在第一次按键时得到更新(在集合中使用断点进行检查)。但是,文本框仅在第二次按键时设置为该值。这仅在属性为null时第一次发生

问题不在于我何时使用backspace清除文本,然后重新开始键入。非常古怪

我费劲地将字符串格式设置为“D”,以便允许用户在文本框中输入“.”值

我找到了下面提到的一些替代方案。但解决办法似乎并不令人信服

如果在Visual Studio中检查调试输出,则在尝试输入第一位数字后,可以看到以下错误消息:

System.Windows.Data错误:6:“StringFormat”转换器无法转换值“5”(键入“Double”);如果可用,将使用回退值。BindingExpression:Path=PointChangeRate;DataItem='MainWindow'(名称='');目标元素是“TextBox”(名称=“”);目标属性为“Text”(类型为“String”)FormatException:“System.FormatException:格式说明符无效

如果您检查了文档,则清楚地说明:

只有整数类型才支持此格式

视图模型中的属性类型为
double?
Nullable
),它不是一个属性

因此,我认为在
StringFormat
中使用
D
是错误的

在绑定上设置
延迟
不是一个坏的解决方案,尽管在另一个答案中引用了这一点。这样用户就有时间在按句点后输入另一个数字


您的情况正好如此。

如果在Visual Studio中检查调试输出,在尝试输入第一位数字后,您会看到以下错误消息:

System.Windows.Data错误:6:“StringFormat”转换器无法转换值“5”(键入“Double”);如果可用,将使用回退值。BindingExpression:Path=PointChangeRate;DataItem='MainWindow'(名称='');目标元素是“TextBox”(名称=“”);目标属性为“Text”(类型为“String”)FormatException:“System.FormatException:格式说明符无效

如果您检查了文档,则清楚地说明:

只有整数类型才支持此格式

视图模型中的属性类型为
double?
Nullable
),它不是一个属性

因此,我认为在
StringFormat
中使用
D
是错误的

在绑定上设置
延迟
不是一个坏的解决方案,尽管在另一个答案中引用了这一点。这样用户就有时间在按句点后输入另一个数字

你的情况正是如此