将绑定值设置为 Xamarin Forms 中行为的参数
Set binding value as a parameter on a behavior in 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' 的值,这可行,但我希望能够发送绑定,以便它自动为文本着色。
请注意,如果重要的话,这是在列表视图中。
请帮忙,我一直卡在这个问题上,找不到任何答案。
我也愿意接受其他实现方法。
谢谢!!
嗯,问题很简单
如果您检查 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()
是标准做法
我认为准确的命名很重要,BindableProperty
必须有实际 属性 的名称,并在末尾附加 "Property"。来自 docs:
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); }
}
如何在 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
,而它应该是关联 属性 的名称而不是 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()
是标准做法
我认为准确的命名很重要,BindableProperty
必须有实际 属性 的名称,并在末尾附加 "Property"。来自 docs:
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); }
}