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>