Установить значение привязки в качестве параметра поведения в формах Xamarin - PullRequest
0 голосов
/ 08 января 2019

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

Когда я делаю это, я получаю: Ошибка. Не найдено ни свойства, ни привязываемого свойства, ни события для «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', это работает, но я хочу иметь возможность отправить привязку, чтобы она автоматически окрашивала текст.

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

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

Спасибо !!

Ответы [ 2 ]

0 голосов
/ 08 января 2019

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

Соглашение о присвоении имен для привязываемых свойств заключается в том, что идентификатор привязываемого свойства должен соответствовать имени свойства, указанному в методе Create, с добавлением к нему «Property».

Так что я считаю, что вы хотите что-то вроде этого:

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); }
}
0 голосов
/ 08 января 2019

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

, если вы проверите 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, когда оно должно быть именем связанного свойства, а не полем Binding, следовательно, ваше свойство должно быть примерно таким:

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() является стандартным способом сделать это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...