Установить значение привязки в качестве параметра для поведения в Xamarin Forms

Как установить значение привязки в качестве параметра поведения в Xamarin Forms?

Когда я это делаю, я получаю: Ошибка. Для InputValue не найдено свойство, привязываемое свойство или событие, или тип несоответствия между значением и свойством.

XAML:

<Label Grid.Column = "0" x:Name = "player" FontSize = "Small" VerticalOptions = "CenterAndExpand" HorizontalOptions = "CenterAndExpand"
                                       Text = "{Binding FormattedName}" >
                                    <Label.Behaviors>
                                        <local:ColorTextLabelBehavior MaxInputValue = "100" MinInputValue = "0" InputValue = "{Binding Happiness}" />
                                    </Label.Behaviors>
                                </Label>

C#:

public class ColorTextLabelBehavior : Behavior<Label>
{
    public static readonly BindableProperty MaxValue = BindableProperty.Create("MaxValue", typeof(int), typeof(ColorTextLabelBehavior), defaultValue: 100);
    public static readonly BindableProperty MinValue = BindableProperty.Create("MinValue", typeof(int), typeof(ColorTextLabelBehavior), defaultValue: 0);
    public static readonly BindableProperty ActualValue = BindableProperty.Create("ActualValue", typeof(int), typeof(ColorTextLabelBehavior), defaultValue: 100);

    public int MaxInputValue
    {
        get { return (int)GetValue(MaxValue); }
        set { SetValue(MaxValue, value); }
    }
    public int MinInputValue
    {
        get { return (int)GetValue(MinValue); }
        set { SetValue(MinValue, value); }
    }
    public int InputValue
    {
        get { return (int)GetValue(ActualValue); }
        set { SetValue(ActualValue, value); }
    }

    void HandleTextChanged(object sender, PropertyChangedEventArgs e)
    {
        try
        {
            float percent = ((float)InputValue - (float)MinInputValue) / ((float)MaxInputValue - (float)MinInputValue);
            double resultRed = Color.Red.R + percent * (Color.Green.R - Color.Red.R);
            double resultGreen = Color.Red.G + percent * (Color.Green.G - Color.Red.G);
            double resultBlue = Color.Red.B + percent * (Color.Green.B - Color.Red.B);
            ((Label)sender).TextColor = new Color(resultRed, resultGreen, resultBlue);
        }
        catch (Exception)
        {

        }
    }

    protected override void OnAttachedTo(BindableObject bindable)
    {
        bindable.PropertyChanged += HandleTextChanged;
    }

    protected override void OnDetachingFrom(BindableObject bindable)
    {
        bindable.PropertyChanged += HandleTextChanged;
    }
}

Если я жестко закодирую значение для «InputValue», это сработает, но я хочу иметь возможность отправить привязку, чтобы она автоматически раскрашивала текст.

Обратите внимание, что это отображается в виде списка, если это важно.

Пожалуйста, помогите, я застрял на этом и не могу найти ответов. Я также открыт для других альтернатив для реализации этого.

Спасибо!!

Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
1 328
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ну проблема довольно простая

если вы проверите свой BindableProperty на наличие ActualValue:

 public int InputValue
{
    get { return (int)GetValue(ActualValue); }
    set { SetValue(ActualValue, value); }
}

public static readonly BindableProperty ActualValue = BindableProperty.Create("ActualValue", typeof(int), typeof(ColorTextLabelBehavior), defaultValue: 100);

Вы устанавливаете имя свойства как ActualValue, тогда как оно должно быть именем связанного свойства, а не полем привязки, поэтому ваше свойство должно быть примерно таким:

public static readonly BindableProperty ActualValue = BindableProperty.Create(nameof(InputValue), typeof(int), typeof(ColorTextLabelBehavior), defaultValue: 100);

public int InputValue
{
    get { return (int)GetValue(ActualValue); }
    set { SetValue(ActualValue, value); }
}

Исправьте то же самое и для двух других свойств.

также обратите внимание, что nameof(InputValue) совпадает с "InputValue", и использование nameof() является стандартным способом сделать это.

Я пробовал это сделать, но по-прежнему получаю ту же ошибку, при запуске она мгновенно выходит из строя. Похоже, поведение не позволит привязать к одному из параметров.

Edude15000 08.01.2019 17:52
Ответ принят как подходящий

Я считаю, что точное наименование важно и что BindableProperty должен иметь имя фактического свойства с добавлением «Свойство» в конце. Из документы:

The naming convention for bindable properties is that the bindable property identifier must match the property name specified in the Create method, with "Property" appended to it.

Итак, я считаю, что вам нужно что-то вроде этого:

public static readonly BindableProperty MaxInputValueProperty = BindableProperty.Create(nameof(MaxInputValue), typeof(int), typeof(ColorTextLabelBehavior), defaultValue: 100);
public static readonly BindableProperty MinInputValueProperty = BindableProperty.Create(nameof(MinInputValue), typeof(int), typeof(ColorTextLabelBehavior), defaultValue: 0);
public static readonly BindableProperty InputValueProperty = BindableProperty.Create(nameof(InputValue), typeof(int), typeof(ColorTextLabelBehavior), defaultValue: 100);

public int MaxInputValue
{
    get { return (int)GetValue(MaxValue); }
    set { SetValue(MaxValue, value); }
}
public int MinInputValue
{
    get { return (int)GetValue(MinValue); }
    set { SetValue(MinValue, value); }
}
public int InputValue
{
    get { return (int)GetValue(ActualValue); }
    set { SetValue(ActualValue, value); }
}

Я реорганизовал свой код, чтобы он выглядел так, и я больше не получаю ошибок, однако InputValue всегда равен 100 по умолчанию, а не привязке, которую я отправляю - public static BindableProperty InputValueProperty = BindableProperty.Create (nameof (InputValue), typeof (int), typeof (ColorTextLabelBehavior), defaultValue: 100); общедоступный int InputValue {получить {return (int) GetValue (InputValueProperty); } set {SetValue (InputValueProperty, значение); }}

Edude15000 09.01.2019 01:49

Так что задайте новый вопрос, почему привязка не работает. Вам также нужно будет показать код XAML.

jgoldberger - MSFT 09.01.2019 02:08

Беглый взгляд показывает возможную проблему. Возможно, вам потребуется вызвать base в методах OnAttachedTo и OnDetachingFrom, например: base.onAttachedTo(bindable), но вы также наследуете от Behavior<Label>, но тогда вы говорите, что это Entry. Если это так, вам необходимо унаследовать от Behavior <Entry>. Если это не помогает, задайте новый вопрос. См .: docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundament‌ als /…

jgoldberger - MSFT 09.01.2019 02:24

Кроме того, поскольку этот ответ решил исходную ошибку, не могли бы вы принять его в качестве ответа? благодаря.

jgoldberger - MSFT 09.01.2019 02:29

Спасибо, что помогли мне решить эту проблему. Я создал здесь еще один вопрос по другой проблеме - stackoverflow.com/questions/54102145/…

Edude15000 09.01.2019 02:37

Итак, я дал подробный ответ на ваш новый вопрос, но когда я отправился публиковать ответ, вы удалили вопрос. Я поставлю свой ответ выше, так как я потратил на это время. Я предлагаю использовать преобразователь значений вместо поведения, которое лучше подходит для того, что вы, кажется, хотите сделать.

jgoldberger - MSFT 09.01.2019 04:03

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