C# 将字符串格式设置为';D';第一次需要按两次键才能将数据输入文本框wpf
这是我的文本框xamlC# 将字符串格式设置为';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
<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
是错误的
在绑定上设置延迟
不是一个坏的解决方案,尽管在另一个答案中引用了这一点。这样用户就有时间在按句点后输入另一个数字
你的情况正是如此