Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 行为-可绑定属性_C#_Xamarin_Bindable - Fatal编程技术网

C# 行为-可绑定属性

C# 行为-可绑定属性,c#,xamarin,bindable,C#,Xamarin,Bindable,我创建了一个用于验证电子邮件输入的行为。下面是网络上的许多例子。正如您所看到的,我的行为有两个可绑定属性,一个是IsValid,另一个是ErrorMessage 在文本更改时,应用程序运行正则表达式验证,并且毫无问题地为IsValid属性指定值true/false。但当它尝试为ErrorMessage属性赋值时,会触发异常: BindableProperty“ErrorMessage”是只读的 有人知道为什么会这样吗?提前谢谢 public class EmailValidatorBehavio

我创建了一个用于验证电子邮件输入的行为。下面是网络上的许多例子。正如您所看到的,我的行为有两个可绑定属性,一个是IsValid,另一个是ErrorMessage

在文本更改时,应用程序运行正则表达式验证,并且毫无问题地为IsValid属性指定值true/false。但当它尝试为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;
    }
}
公共类EmailValidator行为:行为
{

const string emailRegex=@“^(?(“”)(“”)+?(?我认为发生这种情况是因为您有
私有集,所以这可能是一个解决方案:

`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); }
}`
换行

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


不幸的是,它不是。即使使用普通设置,它也会中断,但它不会因IsValid事件中断。它有私有设置。我刚刚添加了一个int类型的属性,它可以正常工作,它不是只读的。这与字符串属性有关吗???有一个行为和电子邮件验证的完整示例;也许你可以比较你的code:谢谢Krumelur,我已经开始了这个例子,但是我想再添加一个属性:ErrorMessage,而不是在实际视图上设置它。这个例子只有关于属性请写一个解释为什么这可以解决问题。
private set { base.SetValue(ErrorMessagePropertyKey, value); }