Как установить значение привязки в качестве параметра поведения в 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», это сработает, но я хочу иметь возможность отправить привязку, чтобы она автоматически раскрашивала текст.
Обратите внимание, что это отображается в виде списка, если это важно.
Пожалуйста, помогите, я застрял на этом и не могу найти ответов. Я также открыт для других альтернатив для реализации этого.
Спасибо!!





Ну проблема довольно простая
если вы проверите свой 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() является стандартным способом сделать это.
Я считаю, что точное наименование важно и что 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, значение); }}
Так что задайте новый вопрос, почему привязка не работает. Вам также нужно будет показать код XAML.
Беглый взгляд показывает возможную проблему. Возможно, вам потребуется вызвать base в методах OnAttachedTo и OnDetachingFrom, например: base.onAttachedTo(bindable), но вы также наследуете от Behavior<Label>, но тогда вы говорите, что это Entry. Если это так, вам необходимо унаследовать от Behavior <Entry>. Если это не помогает, задайте новый вопрос. См .: docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundament als /…
Кроме того, поскольку этот ответ решил исходную ошибку, не могли бы вы принять его в качестве ответа? благодаря.
Спасибо, что помогли мне решить эту проблему. Я создал здесь еще один вопрос по другой проблеме - stackoverflow.com/questions/54102145/…
Итак, я дал подробный ответ на ваш новый вопрос, но когда я отправился публиковать ответ, вы удалили вопрос. Я поставлю свой ответ выше, так как я потратил на это время. Я предлагаю использовать преобразователь значений вместо поведения, которое лучше подходит для того, что вы, кажется, хотите сделать.
Я пробовал это сделать, но по-прежнему получаю ту же ошибку, при запуске она мгновенно выходит из строя. Похоже, поведение не позволит привязать к одному из параметров.