2016-08-18 68 views
2

我已經創建了用於驗證電子郵件輸入的行爲。以下是網絡上的衆多例子。正如你所看到的,我的行爲有兩個可綁定屬性,一個是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; 
    } 
} 
+0

我我剛剛添加了一個int類型的屬性,它的工作原理沒有任何問題,它不是隻讀的。可以將這與字符串屬性相關嗎? – James

+0

有一個完整的行爲和電子郵件驗證示例;也許你可以比較你的代碼:https://blog.xamarin.com/behaviors-in-xamarin-forms/ – Krumelur

+0

感謝Krumelur,我已經開始了這個例子,但想添加一個屬性:ErrorMessage,而不是設置它的實際視圖。該示例僅在屬性 – James

回答

1

我想這是因爲你有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); } 
}` 
+0

不幸的是,它不是。即使正常設置它打破了,但它不會因爲它有私人設置的IsValid事件而中斷 – James

-1

改變這一行

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

private set { base.SetValue(ErrorMessagePropertyKey, value); } 
+0

請寫一個解釋爲什麼這解決了這個問題。 –