2017-05-28 51 views
1

我有一个文本框绑定到一个十进制值(属性),当我键入“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

真是太烦人。你不能按“”。但如果你移回一个角色,它可以让你。这是因为“21”。不是有效的小数。

对我来说,我最终放弃了并且把这个领域变成了一个字符串。必须有更好的方法,但它让我通过了我的使用案例。您还需要检查以确保它是一个数字等,但至少用户体验是他们所期望的。

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); 
} 
+0

感谢,当你说事件(只)..ü意味着摆脱所有的其他事件? ?? – ababeel

+0

是的。至少在文本框中只接受十进制值。 – mm8

相关问题