2016-06-01 13 views
1

Ich weiß, dass es eine Möglichkeit gibt, Daten von Seite StackLayout Variablen an Klasseneigenschaften zu binden, aber leider finde ich keine Ressourcen darüber. Ich weiß, wie man einfaches Binden implementiert. Zum Beispiel: zwischen Editor und Label. Aber wie kann ich Editor Eingabetext an Klasseneigenschaft ex .: string Number {get; set;} binden. Hier ist meine Klasse:Xamarin.Forms Data Bindung an Klasseneigenschaften

public class ThingsObject 
    { 
     public int Id { get; set; } 
     public bool IsStarted { get; set; } 
     public string Number {get; set; } 
     public string City { get; set; } 
     public Zones Zone { get; set; } 
     public ContentPage Page; 
     public DateTime StartDate { get; set; } 
    } 

Und hier ist meine Klasse Pagelayout mit StackLayout Implementierung, Variablen und die Bindung zwischen ihnen.

public partial class ThingPageLayout : CarouselPage 
{ 
List<ThingsObject> things= new List<ThingsObject>(); 
public ThingPageLayout() 
     { 
     things.Add(new ThingsObject() { Id = 1, Number = null, City = null, Zone = null }); 
     foreach (ThingsObject p in things) 
      { 
       Children.Add(CreatePage(p)); 
      } 
     } 
public ContentPage CreatePage(ThingsObject thing) 
     { 
      int uniqueId = this.IdPark; 
      var page = new ContentPage() 
      { 
       Content = new StackLayout { } 
      }; 

      var label1 = new Label 
      { 
       Text = "Text", 
       TextColor = Color.Black, 
       FontSize = Device.GetNamedSize(NamedSize.Medium, typeof(Label)), 
       HorizontalOptions = LayoutOptions.Center 
      }; 
      ((StackLayout)page.Content).Children.Add(label1); 

      var inputText = new Editor 
      { 
       TextColor = Color.Blue, 
       HorizontalOptions = LayoutOptions.Fill, 
       VerticalOptions = LayoutOptions.Fill 
      }; 
      ((StackLayout)page.Content).Children.Add(inputText); 
      // Binding here // 
      label1.BindingContext = inputText; 
      label1.SetBinding(Label.TextProperty, "Text"); 
      // End of binding // 
      var activeButton = new Button 
      { 
       ClassId = uniqueId.ToString(), 
       Text = "Button", 
       HorizontalOptions = LayoutOptions.Fill, 
       VerticalOptions = LayoutOptions.Fill 
      }; 
      ((StackLayout)page.Content).Children.Add(activeButton); 
      thing.Page = page; 
      return page; 
     } 
} 

Und hier sind thingsNumber-Editor eingefügter Wert auf mein bestehendes Objekt binden möchte. Denn wenn Projekte gestartet werden, ist Number Wert null, aber nach Editor Eingang möchte ich eingefügten Text an meine Klasseneigenschaft Number binden.

Antwort

0

Grundsätzlich hat jede Seite (ContentPage, TabPage usw.) eine Eigenschaft BindingContext, in der Sie das Objekt oder besser ein ViewModel zuweisen, an das Sie binden möchten.

So

public class Page1 : ContentPage 
    { 
     public Page1() 
     { 
      BindingContext = new ThingsObject(); 
      var lbl = new Label(); 
      lbl.SetBinding(Label.TextProperty, "Number"); 
      Content = new StackLayout 
      { 
       Children = { 
        lbl 
       } 
      }; 
     } 
    } 
1

Der zweite Parameter des SetBinding() Methode ist eine Zeichenfolge, die die Zieleigenschaft Ihres Bindungskontext, die Sie auf eine Eigenschaft der Steuerung binden möchten bezeichnet. Der erste Parameter gibt die Eigenschaft des Steuerelements an, das aktualisiert werden soll.

So bin ich ziemlich sicher, dass der Code in dieser Zeile:

label1.SetBinding(Label.TextProperty, "Text"); 

Sie wirklich andere zu etwas Bestimmtes gedacht als „Text“ für den zweiten Parameter, wie ich sehe nicht, eine Eigenschaft namens Text erklärt auf Ihrer ThingsObject Klasse.

Die Editor-Steuerelement hat auch eine Eigenschaft, die Sie binden können. Der Code sieht sehr ähnlich, in diesem Beispiel, die eine Bindung an Ihre Number Eigenschaft etablieren würde:

inputText.SetBinding(Editor.TextProperty, "Number"); 

Sie auch die BindingContext des Editors müssten eingestellt, aber es gibt einen Trick, den Sie einen Code speichern können . Wenn ein Steuerelement Bindings hat, aber kein BindingContext explizit festgelegt ist, wird es zu seinem übergeordneten Steuerelement (oder seinem Eltern usw.) suchen, bis es einen BindingContext-Wert findet. Also durch diese Codezeile in Ihrem Beispiel zu ändern:

label1.BindingContext = inputText; 

Um dies:

page.BindingContext = inputText; 

Dann brauchen Sie nicht explizit die BindingContext eines der untergeordneten Steuerelemente setzen, weil sie erben es aus dem übergeordneten Seitencontainer.