TextBox赢了,不允许我输入小数

时间:2014-04-22 19:22:10

标签: c# xaml

我可以在文本框中输入数字,但不允许我输入小数值。请问这是为什么?

<TextBox Text="{Binding SebAmountPer, Mode=Twoway, UpdateSourceTrigger=PropertyChanged}" Grid.Column="1" Grid.Row="2" TextWrapping="Wrap"/>

public decimal? SebAmountPer
{
    get
    {
        return _seb.SEBAmountPer;
    }
    set
    {
        _seb.SEBAmountPer = value; 
        OnPropertyChanged("SebAmountPer");
        OnPropertyChanged("SebTotal");
    }
}

8 个答案:

答案 0 :(得分:3)

您具有与数字数据类型的双向绑定。触发器是属性更改,这意味着在每次击键后。首先尝试绑定到字符串或更改更新触发器。

输入“2.”并且他将绑定更新为2.0并将其转换回来并且只是偷走你的点;)

答案 1 :(得分:2)

廉价的解决方法(如果您仍希望保留内置验证并绑定到可空属性),则在绑定中添加一个小Delay。这允许您实际输入一个小数&#39;点,延迟后#39;它绑定,然后将值评估为正确。

示例:

  <TextBox Text="{Binding SebAmountPer, UpdateSourceTrigger=PropertyChanged, TargetNullValue='', Delay=350}" Height="75" Width="300" TextWrapping="Wrap"/>

答案 2 :(得分:1)

如果你有.NET 4.5或更新版本添加到App.xaml.cs文件System.Windows.FrameworkCompatibilityPreferences.KeepTextBoxDisplaySynchronizedWithTextProperty = false;,如下所示:

public partial class App : Application
{
    public App()
    {
        System.Windows.FrameworkCompatibilityPreferences.KeepTextBoxDisplaySynchronizedWithTextProperty = false;
    }
}

答案 3 :(得分:1)

这是绑定值验证问题,您只需要设置

UpdateSourceTrigger=LostFocus

并在TextBox_PreviewTextInput中使用123456789 0的答案:

private void TextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
   Regex regex = new Regex("^[.][0-9]+$|^[0-9]*[.]{0,1}[0-9]*$");
   e.Handled = !regex.IsMatch((sender as TextBox).Text.Insert((sender as TextBox).SelectionStart,e.Text));
}

答案 4 :(得分:0)

这种行为完全正确,因为点 - &#34;。&#34;独自站立并没有任何意义。

以下是有效数字: 1,3.3,23.124,1。,23.0

以下是无效数字:。 - &gt;(我的意思是点),。12

如果您不想这样做,请使用以下代码。

private void TextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
   Regex regex = new Regex("^[.][0-9]+$|^[0-9]*[.]{0,1}[0-9]*$");
   e.Handled = !regex.IsMatch((sender as TextBox).Text.Insert((sender as TextBox).SelectionStart,e.Text));
}

答案 5 :(得分:0)

我使用值转换器来解决此问题。

public class DecimalConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value != null)
        {
            string s_value = value.ToString();
            if (s_value.EndsWith("."))
            {
                return s_value.Replace(".", ".0");
            }
            else if (s_value.Contains(".") && s_value.EndsWith("0"))
            {
                return s_value.Substring(0, s_value.Length - 1);
            }
            return value;
        }
        return null;
    }
}



<TextBox>
    <Binding Path="UnitCost" UpdateSourceTrigger="PropertyChanged" Converter="{StaticResource decimalConverter}"/>
</TextBox>

答案 6 :(得分:0)

您可以从UpdateSourceTrigger=PropertyChanged更改为UpdateSourceTrigger=LostFocus。它将允许您插入点/逗号,并在更改光标框时进行验证。

答案 7 :(得分:0)

试试这个。 我改变了

UpdateSourceTrigger=PropertyChanged 

UpdateSourceTrigger=LostFocus

<TextBox Text="{Binding SebAmountPer, UpdateSourceTrigger=LostFocus}" Grid.Column="1" Grid.Row="2" TextWrapping="Wrap"/>