XAML中的类属性声明

XAML中的类属性声明,xaml,xamarin,Xaml,Xamarin,我对XAML名称空间声明感到困惑。 请帮我澄清一下我的情况。我在CoTraveler命名空间中有BooleanToObjectConverter:IValueConverter类: public class EmailValidatorBehavior : Behavior<Entry> { const string digitRegex = @"^(?("")("".+?(?<!\\)""@)|(([0-9a-z]((\.(?!\.))|[-!#\$%&'\*

我对XAML名称空间声明感到困惑。 请帮我澄清一下我的情况。我在CoTraveler命名空间中有BooleanToObjectConverter:IValueConverter类:

public class EmailValidatorBehavior : Behavior<Entry>
{
    const string digitRegex = @"^(?("")("".+?(?<!\\)""@)|(([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 IsVisiblePropertyKey = BindableProperty.CreateReadOnly("IsVisible", typeof(bool), typeof(EmailValidatorBehavior), false);
public static readonly BindableProperty IsVisibleProperty = IsVisiblePropertyKey.BindableProperty;

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

public bool IsVisible
{
    get { return (bool)base.GetValue(IsVisibleProperty); }
    private set { base.SetValue(IsVisiblePropertyKey, value); }
}

protected override void OnAttachedTo(Entry entry)
{
    entry.TextChanged += OnEntryTextChanged;
    base.OnAttachedTo(entry);
}

protected override void OnDetachingFrom(Entry entry)
{
    entry.TextChanged -= OnEntryTextChanged;
    base.OnDetachingFrom(entry);
}

void OnEntryTextChanged(object sender, TextChangedEventArgs e)
{
    if (e.NewTextValue.Length > 0)
    {
        IsVisible = true;
        Entry entry = (Entry)sender;
        IsValid = Regex.IsMatch(e.NewTextValue, digitRegex);

        if (IsValid) // Check only if we have a valid email
        {
            // Here we validate if the email contains our requirements
            String email = entry.Text;
            int pos = email.IndexOf("@"); // Exclude the domain
            string username = email.Substring(0, pos);
            if (username.Contains(FRIEND) || username.Contains(FRIENDS))
            {
                IsValid = true;
            }
            else
                IsValid = false;
        }
    }
    else
        IsVisible = false;
}

public class BooleanToObjectConverter<Image> : IValueConverter
{
    public Image FalseObject { set; get; }

    public Image TrueObject { set; get; }

    public object Convert(object value, Type targetType,
                          object parameter, CultureInfo culture)
    {
        return (bool)value ? this.TrueObject : this.FalseObject;
    }

    //public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    //{
    //    throw new NotImplementedException();
    //}

    public object ConvertBack(object value, Type targetType,
                              object parameter, CultureInfo culture)
    {
        return ((Image)value).Equals(this.TrueObject);
    }

    //public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    //{
    //    throw new NotImplementedException();
    //}
}
公共类EmailValidator行为:行为
{

常量字符串digitRegex=@“^(?(“”)(“”)+?(?从DependencyObject派生,以便能够使用可绑定的DependencyProperties:

public class BooleanToObjectConverter: DependencyObject, IValueConverter
{
    public Image FalseObject
    {
        get
        {
            return (Image)GetValue(FalseObjectProperty);
        }
        set
        {
            SetValue(FalseObjectProperty, value);
        }
    }

    public static readonly DependencyProperty FalseObjectProperty =
        DependencyProperty.Register(
            "FalseObject", 
            typeof(Image), 
            typeof(BooleanToObjectConverter<Image>), 
            new PropertyMetadata(null));

    public Image TrueObject
    {
        get
        {
            return (Image)GetValue(TrueObjectProperty);
        }
        set
        {
            SetValue(TrueObjectProperty, value);
        }
    }

    public static readonly DependencyProperty TrueObjectProperty =
        DependencyProperty.Register(
            "TrueObject",
            typeof(Image), 
            typeof(BooleanToObjectConverter<Image>), 
            new PropertyMetadata(null));

    public object Convert(object value, Type targetType,
                          object parameter, CultureInfo culture)
    {
        return (bool)value ? this.TrueObject : this.FalseObject;
    }

    public object ConvertBack(object value, Type targetType,
                              object parameter, CultureInfo culture)
    {
        return ((Image)value).Equals(this.TrueObject);
    }
}
公共类BooleanToObjectConverter:DependencyObject,IValueConverter
{
公众形象虚假客体
{
得到
{
返回(图像)GetValue(FalseObjectProperty);
}
设置
{
SetValue(FalseObjectProperty,值);
}
}
公共静态只读DependencyProperty FalseObjectProperty=
从属属性。寄存器(
“假对象”,
类型(图像),
类型(布尔对象转换器),
新属性元数据(空);
公共图像对象
{
得到
{
返回(图像)GetValue(TrueObjectProperty);
}
设置
{
SetValue(TrueObjectProperty,值);
}
}
公共静态只读从属属性TrueObjectProperty=
从属属性。寄存器(
“TrueObject”,
类型(图像),
类型(布尔对象转换器),
新属性元数据(空);
公共对象转换(对象值,类型targetType,
对象参数,CultureInfo(区域性)
{
返回(bool)值?this.TrueObject:this.false对象;
}
公共对象转换回(对象值,类型targetType,
对象参数,CultureInfo(区域性)
{
返回((图像)值).Equals(this.TrueObject);
}
}
旁注:这里泛型的用法没有多大意义,所以我删除了它


如果最初的目的是使用实际的泛型类型,请参见:因为为资源字典中的条目指定泛型类型参数并不是那么简单。

在WPF中,我从DependencyObject派生valueconverter,以便在转换器中使用DependencyProperties。您可以绑定到的属性。请参见:
public class BooleanToObjectConverter: DependencyObject, IValueConverter
{
    public Image FalseObject
    {
        get
        {
            return (Image)GetValue(FalseObjectProperty);
        }
        set
        {
            SetValue(FalseObjectProperty, value);
        }
    }

    public static readonly DependencyProperty FalseObjectProperty =
        DependencyProperty.Register(
            "FalseObject", 
            typeof(Image), 
            typeof(BooleanToObjectConverter<Image>), 
            new PropertyMetadata(null));

    public Image TrueObject
    {
        get
        {
            return (Image)GetValue(TrueObjectProperty);
        }
        set
        {
            SetValue(TrueObjectProperty, value);
        }
    }

    public static readonly DependencyProperty TrueObjectProperty =
        DependencyProperty.Register(
            "TrueObject",
            typeof(Image), 
            typeof(BooleanToObjectConverter<Image>), 
            new PropertyMetadata(null));

    public object Convert(object value, Type targetType,
                          object parameter, CultureInfo culture)
    {
        return (bool)value ? this.TrueObject : this.FalseObject;
    }

    public object ConvertBack(object value, Type targetType,
                              object parameter, CultureInfo culture)
    {
        return ((Image)value).Equals(this.TrueObject);
    }
}