我是WPF(VS2013,.NET Framework 4.5)的新手,对我来说很惊讶的是我无法在文本框中输入浮点值。 我的文本框绑定到一个浮点变量。如果该变量默认为5,则文本框将显示5.但我有一个问题:
我无法进入。如果我想说5.5。为了解决这个问题,我发现有人建议添加到xaml文本框绑定“StringFormat=N2
”。
这造成了更多问题:
1. Now even if I have even number like 5, it shows as 5.00
2. If I put cursor btw 2 zeros or anywhere else, neither backspace nor delete key will delete the entrie
3. If I put cursor btw 5 and . (in 5.00) and type ".10", I end up with 5.10.00.
WPF中的数字输入是否可能如此复杂?我想要的只是输入一个存储在浮点数中的数字。
If I enter 5, it should show as 5 in TextBox.
If I enter 5.05, than that is how it should show in TextBox.
底层浮点变量可以同时包含5和5.05,两者都是浮点数。
更新: 这是我的代码
private float age;
public float Age {
get { return age; }
set
{
if (value <= 0 || value > 120)
{
throw new ArgumentException("The age must be between 0 and 120 years");
}
age= value;
}
}
并在XAML中:
<TextBox Name="txtAge" Text="{Binding Age, UpdateSourceTrigger=PropertyChanged, StringFormat=N1, ValidatesOnExceptions=True}" />
答案 0 :(得分:0)
来自标准数字格式字符串
该数字将转换为“-d,ddd,ddd.ddd ...”形式的字符串, 其中' - '表示负号码符号,如果需要,'d' 表示一个数字(0-9),','表示千位之间的分隔符 数字组和'。'表示小数点符号。
似乎N将包含数千个分隔符。
答案 1 :(得分:0)
代码中没有绑定。请注意 路径=年龄 :
<TextBox Grid.Row="0" Text="{Binding Path=Age, UpdateSourceTrigger=PropertyChanged, StringFormat=N1, ValidatesOnExceptions=True}"/>
模型视图与视图模型之间的绑定:
var myModel = new ViewModel();
control.DataContext = myModel;
然后是ViewModel(实现 INotifyPropertyChanged 界面)
public class ViewModel : INotifyPropertyChanged
{
private float _age;
public float Age
{
get { return _age; }
set
{
if (value.Equals(_age)) return;
_age = value;
OnPropertyChanged("Age");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName = null)
{
var handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
你应该对MVVM文学感兴趣:
正如另一个答案所暗示的那样,您可能在您希望的小数点分隔符(。)与您的系统认为的小数点分隔符(可能是其他类似的东西)之间存在不匹配。
答案 2 :(得分:0)
我在这个网站上找到了解决方案,诀窍是强制框架4的行为
如果您仍想使用'UpdateSourceTrigger = PropertyChanged',则可以通过将以下代码行添加到App.xaml.cs的构造函数中来强制.NET 4.5应用程序中的.NET 4行为:
public App()
{
System.Windows.FrameworkCompatibilityPreferences
.KeepTextBoxDisplaySynchronizedWithTextProperty = false;
}
来源: