我可以在文本框中输入数字,但不允许我输入小数值。请问这是为什么?
<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");
}
}
答案 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"/>