Объявление свойства класса в XAML

Я запутался в объявлении пространства имен XAML. Пожалуйста, помогите прояснить мой случай. У меня есть класс BooleanToObjectConverter: IValueConverter в пространстве имен CoTraveller:

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();
    //}
}

}

Я хочу использовать свойства FalseObject и TrueObject в ресурсах приложения, например:

<Application 
    xmlns = "http://xamarin.com/schemas/2014/forms" 
    xmlns:x = "http://schemas.microsoft.com/winfx/2009/xaml" 
    x:Class = "CoTraveller.RegistrationPage"
   xmlns:local = "clr-namespace:CoTraveller">
    <Application.Resources>
        <!-- Application resource dictionary -->
        <ResourceDictionary>
            <local:BooleanToObjectConverter x:Key = "boolToStyleImage" 
x:TypeArguments = "Style">
                <local:BooleanToObjectConverter.FalseObject>
                    <Style TargetType = "Image">
                        <Setter Property = "HeightRequest" Value = "24" />
                        <Setter Property = "Source" 
Value = "your_wrong_image_here.png" />
                    </Style>
                </local:BooleanToObjectConverter.FalseObject>

                <x:BooleanToObjectConverter.TrueObject>
                    <Style TargetType = "Image">
                        <Setter Property = "HeightRequest" Value = "24" />
                        <Setter Property = "Source" 
Value = "your_correct_image_here.png" />
                    </Style>
                </x:BooleanToObjectConverter.TrueObject>
            </local:BooleanToObjectConverter>
        </ResourceDictionary>
    </Application.Resources>
</Application>

но есть ошибка: Код серьезности Описание Состояние подавления строки файла проекта Ошибка XLS0415 Присоединяемое свойство FalseObject не найдено в типе BooleanToObjectConverter. CoTraveller App.xaml 11

В чем проблема?

В WPF я получаю преобразователь значений из DependencyObject, поэтому я могу использовать DependencyProperties в преобразователе. Те, к которым вы можете привязаться. См .: stackoverflow.com/questions/48539313/…

Emond Erno 22.07.2018 22:23
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
1 869
1

Ответы 1

Наследовать от 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);
    }
}

Боковое примечание: использование универсального здесь не имеет большого смысла, поэтому я удалил его.

Если исходное намерение состояло в том, чтобы использовать фактический универсальный тип, см. Универсальный тип в ресурсах Xaml, потому что не так просто указать аргумент универсального типа для записей в словаре ресурсов.

Другие вопросы по теме