Xamarin.forms 将控件绑定到行为属性会尝试将属性设置为绑定而不是控件
我有以下一组数字条目,其行为应在输入或删除数字时在它们之间转移焦点:Xamarin.forms 将控件绑定到行为属性会尝试将属性设置为绑定而不是控件,xamarin.forms,Xamarin.forms,我有以下一组数字条目,其行为应在输入或删除数字时在它们之间转移焦点: <StackLayout HorizontalOptions="Center" VerticalOptions="Center"> <Label>Enter Code</Label> <StackLayout Orientation="Horizontal"> <Entry Keyboard="Numeric" x:Name="FirstDi
<StackLayout HorizontalOptions="Center" VerticalOptions="Center">
<Label>Enter Code</Label>
<StackLayout Orientation="Horizontal">
<Entry Keyboard="Numeric" x:Name="FirstDigit" Text="{Binding Digit1}">
<Entry.Behaviors>
<behaviours:DigitEntryBehaviour NextDigit="{Binding Source={x:Reference Name=SecondDigit}}" />
</Entry.Behaviors>
</Entry>
<Entry Keyboard="Numeric" x:Name="SecondDigit" Text="{Binding Digit2}">
<Entry.Behaviors>
<behaviours:DigitEntryBehaviour PrevDigit="{Binding Source={x:Reference Name=FirstDigit}}" NextDigit="{Binding Source={x:Reference Name=ThirdDigit}}" />
</Entry.Behaviors>
</Entry>
<Entry Keyboard="Numeric" x:Name="ThirdDigit" Text="{Binding Digit3}">
<Entry.Behaviors>
<behaviours:DigitEntryBehaviour PrevDigit="{Binding Source={x:Reference Name=SecondDigit}}" NextDigit="{Binding Source={x:Reference Name=FourthDigit}}" />
</Entry.Behaviors>
</Entry>
<Entry Keyboard="Numeric" x:Name="FourthDigit" Text="{Binding Digit4}">
<Entry.Behaviors>
<behaviours:DigitEntryBehaviour PrevDigit="{Binding Source={x:Reference Name=ThirdDigit}}" />
</Entry.Behaviors>
</Entry>
</StackLayout>
<Button Text="Open"></Button>
</StackLayout>
输入代码
下面是DigitEntryBehaviour
public class DigitEntryBehaviour : Behavior<Entry>
{
public Entry PrevDigit { get; set; }
public Entry NextDigit { get; set; }
protected override void OnAttachedTo(Entry bindable)
{
base.OnAttachedTo(bindable);
bindable.TextChanged += OnEntryTextChanged;
}
protected override void OnDetachingFrom(Entry bindable)
{
base.OnDetachingFrom(bindable);
bindable.TextChanged -= OnEntryTextChanged;
}
private void OnEntryTextChanged(object sender, TextChangedEventArgs e)
{
var entry = (Entry)sender;
if (entry.Text.Length > 1)
{
entry.TextChanged -= OnEntryTextChanged;
entry.Text = e.OldTextValue;
entry.TextChanged += OnEntryTextChanged;
string newChar = e.NewTextValue.Substring(1);
if (NextDigit != null)
NextDigit.Text = newChar;
}
else if (entry.Text.Length > 0)
{
NextDigit?.Focus();
}
else
{
PrevDigit?.Focus();
}
}
}
公共类DigitEntryBehaviour:行为
{
公共项PrevDigit{get;set;}
公共项NextDigit{get;set;}
受保护的覆盖无效数据到(条目可绑定)
{
碱。可粘合的DTO(可粘合);
bindable.TextChanged+=OnEntryTextChanged;
}
受保护的覆盖无效OnDetachingFrom(条目可绑定)
{
基础。从(可装订)开始连接;
bindable.TextChanged-=OnEntryTextChanged;
}
私有void OnEntryTextChanged(对象发送方,textchangedventargs e)
{
var条目=(条目)发送方;
如果(entry.Text.Length>1)
{
entry.TextChanged-=OnEntryTextChanged;
entry.Text=e.OldTextValue;
entry.TextChanged+=OnEntryTextChanged;
字符串newChar=e.NewTextValue.Substring(1);
如果(NextDigit!=null)
NextDigit.Text=newChar;
}
else if(entry.Text.Length>0)
{
NextDigit?.Focus();
}
其他的
{
PrevDigit?.Focus();
}
}
}
当我尝试运行它时,会出现以下异常:
Xamarin.Forms.Xaml.XamlParseException:'位置18:53。无法分配
属性“NextDigit”:属性不存在或不可转让,
或值与属性“”之间的类型不匹配
我尝试将DigitEntryBehaviour对象的NextDigit和PrevDigit属性的类型设置为object,以查看它试图分配给它们的类型,似乎它试图将它们设置为
Binding
s,而不是Entry
s。为什么要这样做?如何使其正确地将条目
绑定到这些属性?要使绑定
起作用,目标属性必须是可绑定属性,而目标对象应该是可绑定对象
由于DigitEntryBehaviour
不是一个BindableObject
-您不能声明可绑定属性-因此不能创建绑定
解决此问题的最简单方法是删除绑定
标记扩展,并直接使用引用
扩展来提供条目
控件引用。i、 e.NextDigit=“{x:Reference Name=SecondDigit}”
更新的XAML
<Entry Keyboard="Numeric" x:Name="FirstDigit" Text="{Binding Digit1}">
<Entry.Behaviors>
<behaviours:DigitEntryBehaviour NextDigit="{x:Reference Name=SecondDigit}" />
</Entry.Behaviors>
</Entry>
<Entry Keyboard="Numeric" x:Name="SecondDigit" Text="{Binding Digit2}">
<Entry.Behaviors>
<behaviours:DigitEntryBehaviour PrevDigit="{x:Reference Name=FirstDigit}" NextDigit="{x:Reference Name=ThirdDigit}" />
</Entry.Behaviors>
</Entry>
<Entry Keyboard="Numeric" x:Name="ThirdDigit" Text="{Binding Digit3}">
<Entry.Behaviors>
<behaviours:DigitEntryBehaviour PrevDigit="{x:Reference Name=SecondDigit}" NextDigit="{x:Reference Name=FourthDigit}" />
</Entry.Behaviors>
</Entry>
<Entry Keyboard="Numeric" x:Name="FourthDigit" Text="{Binding Digit4}">
<Entry.Behaviors>
<behaviours:DigitEntryBehaviour PrevDigit="{x:Reference Name=ThirdDigit}" />
</Entry.Behaviors>
</Entry>