RadMaskedNumericInput binding issues

3 posts, 0 answers
  1. Mike
    Mike avatar
    8 posts
    Member since:
    Jul 2010

    Posted 07 Mar 2012 Link to this post

    Hello, I am trying to use the RadMaskedNumericInput control for masking text and binding on some customer data, such as phone numbers. I have found this control to be extremely buggy and unusable. 

    I am using a custom mask "(###) ###-####" and it works fine. The phone numbers are stored as 10 digit strings with no separators ("0123456789" for example). When I load a customer, the value shows up correctly masked in the control (I see (012) 345-6789). 

    The main problem is that the bound property on the model never gets set. So if I am entering a new customer and type in the phone number, it does not get saved. I found that this is because the Value property of the numeric input never gets changed, as the conversion from string always fails. I have tried setting ValueToTextConverter to convert between double? and string, and I found that when NumericInput attempts to convert what is typed and store it the double? Value property, it always includes the mask in the string it's trying to convert. So it tries to convert "(012) 345-6789" to a double and this of course fails. I have tried binding to the Text property instead, but this does not work either as it includes the characters from the mask.

    I have TextMode set to MaskedText, please do not recommend that as the solution because it does not work. I have tried setting it in markup and via an extended class. If I set it in markup, the typed text will stay in the control, but still the values will never be set. If I set TextMode via the extended class, the typed characters will disappear when the control loses focus, though they will reappear when it regains focus. But still the databinding will not set the model's properties.

    I am using release 2011.3.1116.40 and unfortunately upgrading is not possible as this is the version provided and required by my client.

    Here is the code for the value converter I used with MaskedNumericInput:

    [CanConvert(typeof(System.String), typeof(System.Nullable<double>))]
    public class StringToNullableDouble : IValueConverter
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            string s = value as string;
            if (s == null) return null;
            double d;
            if (Double.TryParse(s, out d)) return d;
            return null;
        public object ConvertBack(object value, Type targetType,
        object parameter, System.Globalization.CultureInfo culture)
            double? d = value as double?;
            if (d == null || !d.HasValue) return null;
            return d.Value.ToString();

    Here is a XAML sample:

     EmptyContent="Enter Phone"
    Mask="(###) ###-####"
    Value="{Binding Path=Customer.Phone, ValidatesOnDataErrors=True, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
    AllowInvalidValues = "False"
     AutoFillNumberGroupSeparators = false;
      AutoFillZeros = "False"
    FlowDirection = "LeftToRight"
     Precision = "0"
     HorizontalContentAlignment = "Left"
    TextMode = "MaskedText"
    SpinMode = "None"
  2. Alex Fidanov
    Alex Fidanov avatar
    637 posts

    Posted 12 Mar 2012 Link to this post


    If you are binding to a string property, then I would suggest using the MaskedTextInput control and not the numeric one, as it is for numeric values. You would also not need the converter. Please note that the ValueToText converter is used to convert the Value to Text and be displayed as Text of the control, and not value. I believe that you need to apply the converter to the binding between your custom object and the mask's value.

    All the best,
    Alex Fidanov
    the Telerik team
    Sharpen your .NET Ninja skills! Attend Q1 webinar week and get a chance to win a license! Book your seat now >>
  3. Mike
    Mike avatar
    8 posts
    Member since:
    Jul 2010

    Posted 14 Mar 2012 Link to this post

    Thank you for the suggestion. I have tried this and it is working well.
Back to Top