Поведение - привязываемое свойство

Я создал поведение для проверки ввода электронной почты. Следуя многочисленным примерам в сети. Как видите, у моего поведения есть два привязываемых свойства: одно - IsValid, а второе - ErrorMessage.

При изменении текста приложение выполняет проверку регулярного выражения и без каких-либо проблем присваивает значение true / false свойству IsValid. Но когда он пытается присвоить значение свойству ErrorMessage, он вызывает исключение:

Свойство BindableProperty «ErrorMessage» доступно только для чтения.

Есть ли у кого-нибудь идеи, почему это происходит? Заранее спасибо!

public class EmailValidatorBehavior : Behavior<Entry>
{
    const string emailRegex = @"^(?("")("".+?(?<!\\)""@)|(([0-9a-z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-z])@))" +
    @"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9][\-a-z0-9]{0,22}[a-z0-9]))$";

    static readonly BindablePropertyKey IsValidPropertyKey = BindableProperty.CreateReadOnly("IsValid", typeof(bool), typeof(EmailValidatorBehavior), false);

    public static readonly BindableProperty IsValidProperty = IsValidPropertyKey.BindableProperty;

    static readonly BindablePropertyKey ErrorMessagePropertyKey = BindableProperty.CreateReadOnly("ErrorMessage", typeof(String), typeof(EmailValidatorBehavior), "");

    public static BindableProperty ErrorMessageProperty = ErrorMessagePropertyKey.BindableProperty;


    public bool IsValid
    {
        get { return (bool)base.GetValue(IsValidProperty); }
        private set { base.SetValue(IsValidPropertyKey, value); }
    }

    public string ErrorMessage
    {
        get { return (string)base.GetValue(ErrorMessageProperty); }
        private set { base.SetValue(ErrorMessageProperty, value); }
    }


    void HandleTextChanged(object sender, TextChangedEventArgs e)
    {


        IsValid = (Regex.IsMatch(e.NewTextValue, emailRegex,        
RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(250)));
        ((Entry)sender).TextColor = IsValid ? Color.Default : Color.Red;

        if (String.IsNullOrEmpty(e.OldTextValue))
            ErrorMessage = "";
        else
        {
            ErrorMessage = "Please enter email address";
            return;
        }
        if (!IsValid)
            ErrorMessage = "Please enter valid email address";
        else
            ErrorMessage = "";

    }


    protected override void OnAttachedTo(Entry bindable)
    {
        bindable.TextChanged += HandleTextChanged;
    }
    protected override void OnDetachingFrom(Entry bindable)
    {
        bindable.TextChanged -= HandleTextChanged;
    }
}

person James    schedule 18.08.2016    source источник
comment
Я только что добавил еще одно свойство типа int, и оно работает без проблем, не только для чтения. Может быть это связано со свойствами строки ????   -  person James    schedule 18.08.2016
comment
Есть полный пример поведения и проверки электронной почты; возможно, вы можете сравнить свой код: blog.xamarin.com/behaviors-in-xamarin- формы   -  person Krumelur    schedule 18.08.2016
comment
Спасибо Krumelur, я начал с этого примера, но хотел добавить еще одно свойство: ErrorMessage вместо того, чтобы установить его в фактическом представлении. Пример имеет только собственность   -  person James    schedule 19.08.2016


Ответы (2)


Я думаю, это происходит потому, что у вас private set, поэтому, возможно, это было бы решением:

`public bool IsValid
{
    get { return (bool)base.GetValue(IsValidProperty); }
    set { base.SetValue(IsValidPropertyKey, value); }
}

public string ErrorMessage
{
    get { return (string)base.GetValue(ErrorMessageProperty); }
    set { base.SetValue(ErrorMessageProperty, value); }
}`
person Tomasz Kowalczyk    schedule 18.08.2016
comment
К сожалению, это не так. Даже с нормальным набором он ломается, но он не ломается для события IsValid, у него есть частный набор - person James; 18.08.2016

Измените эту строку

private set { base.SetValue(ErrorMessageProperty, value); }

to

private set { base.SetValue(ErrorMessagePropertyKey, value); }
person Kenneth Swärd    schedule 14.08.2017
comment
Напишите, пожалуйста, объяснение, почему это решает проблему. - person Laposhasú Acsa; 14.08.2017