允许小数条目的WPF文本框

时间:2015-12-17 04:33:11

标签: wpf xaml textbox floating-point

我是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}" />

3 个答案:

答案 0 :(得分:0)

来自标准数字格式字符串

  

该数字将转换为“-d,ddd,ddd.ddd ...”形式的字符串,   其中' - '表示负号码符号,如果需要,'d'   表示一个数字(0-9),','表示千位之间的分隔符   数字组和'。'表示小数点符号。

似乎N将包含数千个分隔符。

另见Custom Numeric Format Strings

答案 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;
}

来源:

http://www.sebastianlux.net/2014/06/21/binding-float-values-to-a-net-4-5-wpf-textbox-using-updatesourcetriggerpropertychanged/