将绑定值设置为 Xamarin Forms 中行为的参数
Posted
技术标签:
【中文标题】将绑定值设置为 Xamarin Forms 中行为的参数【英文标题】:Set binding value as a parameter on a behavior in Xamarin Forms 【发布时间】:2019-06-02 20:11:53 【问题描述】:如何?
当我这样做时,我得到: 错误。未找到“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”硬编码一个值,这是可行的,但我希望能够发送一个绑定,以便它自动为文本着色。
如果重要的话,请注意这是在列表视图中。
请帮忙,我一直卡在这个问题上,找不到任何答案。 我也愿意接受其他替代方案来实现这一点。
谢谢!!
【问题讨论】:
【参考方案1】:我认为确切的命名很重要,BindableProperty
必须具有实际属性的名称,并在末尾附加“Property”。来自docs:
可绑定属性的命名约定是可绑定属性标识符必须与 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);
【讨论】:
我将代码重构为如下所示,并且不再出现错误,但是 InputValue 始终是默认值 100,而不是我发送的绑定 - public static BindableProperty InputValueProperty = BindableProperty.Create(nameof( InputValue), typeof(int), typeof(ColorTextLabelBehavior), defaultValue: 100);公共 int InputValue get return (int)GetValue(InputValueProperty); set SetValue(InputValueProperty, value); 所以问一个新问题,为什么绑定不起作用。您还需要显示 XAML 代码。 快速浏览会发现一个可能的问题。您可能需要在OnAttachedTo
和OnDetachingFrom
方法中调用base
,例如:base.onAttachedTo(bindable)
,但您也是从Behavior<Label>
继承的,但您说这是一个Entry
。如果是这样,您需要从 Behavior这个问题很简单
如果您检查您的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()
是标准的做法
【讨论】:
我试过这样做,我仍然得到同样的错误,它在运行时立即失败。似乎该行为不允许绑定到其中一个参数。以上是关于将绑定值设置为 Xamarin Forms 中行为的参数的主要内容,如果未能解决你的问题,请参考以下文章
将方法从后面的代码转换为 ICommand 数据绑定 Xamarin.Forms
如何在 Xamarin Forms 中将 ListView 按钮的绑定上下文设置为父级的绑定上下文
如何将键盘设置为数字小键盘,我可以在 Xamarin.Forms 中输入负数吗?