2017-11-10 2 views
1

I gesetzt habe den folgenden Satz von numerischen Eingaben mit Verhaltensweisen, die den Fokus zwischen ihnen verschieben sollten als Ziffern eingegeben oder entfernt werden:eine Steuerung zu einem Verhalten Eigenschaft Binding versucht, die Eigenschaft auf eine Bindung anstelle der Steuer

<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> 

Unten ist 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(); 
     } 
    } 
} 

Wenn ich versuche, es zu laufen, ich die folgende Ausnahme erhalten:

Xamarin.Forms.Xaml.XamlParseException: 'Position 18:53. Kann nicht Eigenschaft „NextDigit“ zuweisen: Eigenschaft existiert nicht oder ist nicht übertragbar, oder unpassende Art zwischen Wert und Eigentum‘

mir die Art der NextDigit und PrevDigit Eigenschaften von DigitEntryBehaviour versuchte Einstellung zum Objekt zu sehen welcher Typ versucht wurde, ihnen zuzuordnen, und es scheint, dass versucht wird, sie auf Binding s statt Entry s zu setzen. Warum macht es das? Wie kann ich die Entry s korrekt an diese Eigenschaften binden?

Antwort

1

Für eine Binding zu arbeiten - die Ziel-Eigenschaft muss eine bindbare Eigenschaft sein, während das Zielobjekt sollte eine BindableObject sein.

Als DigitEntryBehaviour ist kein BindableObject - Sie können nicht verbindlich Eigenschaften deklarieren - und damit keine Bindung (en) erstellen.

einfachste Möglichkeit dieses Problem zu beheben wäre, die Binding Markup-Erweiterung zu entfernen, und direkt die Reference Erweiterung verwenden, um die Entry Steuer reference (s) zur Verfügung zu stellen. d.h. NextDigit="{x:Reference Name=SecondDigit}".

XAML Aktualisiert

<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> 
Verwandte Themen