我有一个绑定到十进制值(属性)的文本框,当我输入“3”时它不允许我进入,因为它将它解析回3,因此我失去了“。”。我试过像Delay / LostFocus等解决方案,但这对我来说不起作用,来自WPF validation rule preventing decimal entry in textbox?。
我现在写了一个IValueConverter类,我显然没有正确地做到这一点。这是代码:
[ValueConversion(typeof(decimal), typeof(string))]
public class DecimalToStringConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
//return Decimal.Parse(value.ToString());
if (value == null) return Decimal.Zero;
if (!(value is string)) return value;
string s = (string)value;
int dotCount = s.Count(f => f == '.');
Decimal d;
bool parseValid = Decimal.TryParse(s, out d);
System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex("^[-+]?([0-9]*?[.])?[0-9]*$");
bool b = regex.IsMatch(s);
if (dotCount == 1 && b)
{
return s;
}
return d;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value != null ? value.ToString() : "";
}
}
XAML
<TextBox x:Name="ValueTextBox" Grid.Column="0" Grid.RowSpan="2" VerticalContentAlignment="Center" Text ="{Binding Value, Converter={StaticResource DecimalToStringConverter}}" PreviewTextInput="ValueTextBox_OnPreviewTextInput" TextWrapping="Wrap" MouseWheel="ValueTextBox_MouseWheel" PreviewKeyDown="ValueTextBox_PreviewKeyDown" PreviewKeyUp="ValueTextBox_PreviewKeyUp" TextChanged="ValueTextBox_TextChanged" BorderThickness="1,1,0,1"/>
请告知我如何纠正这个... 感谢
答案 0 :(得分:1)
太烦人了。你不能按“。”但是如果你移回一个角色就可以了。这是因为“21”不是有效的小数。
对我来说,我最终放弃了,并使该字段成为一个字符串。必须有一个更好的方法,但它让我超越了我的用例问题。然后你还需要检查以确保它是一个数字等,但至少用户体验是他们所期望的。
答案 1 :(得分:0)
尝试像这样处理PreviewTextInput
事件(仅限):
<TextBox x:Name="ValueTextBox" Grid.Column="0" Grid.RowSpan="2" VerticalContentAlignment="Center"
Text ="{Binding Value}" PreviewTextInput="ValueTextBox_PreviewTextInput" />
private void ValueTextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
decimal value;
e.Handled = string.IsNullOrEmpty(e.Text) || !decimal.TryParse($"{ValueTextBox.Text}{e.Text}",
System.Globalization.NumberStyles.Any,
System.Globalization.CultureInfo.InvariantCulture, out value);
}
答案 2 :(得分:0)
尝试一下
这将只允许在文本框中输入小数,而不能输入其他任何内容。
viewmodel看起来像这样:
@babel/polyfill
XAML的用法如下:
@babel/polyfill