2016-06-01 2 views
1

StackLayout 변수의 데이터를 클래스 속성에 바인딩하는 방법이 있지만 불행히도 그것에 대한 리소스를 찾지 못했습니다. 간단한 바인딩을 구현하는 방법을 안다. 예 : EditorLabel 사이 그러나 Editor 입력 텍스트를 클래스 속성 예 : string Number {get; set;}에 바인딩하려면 어떻게해야합니까? 다음은 클래스입니다.Xamarin.Forms 클래스 속성에 대한 데이터 바인딩

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

여기에는 StackLayout 구현, 변수 및 바인딩이 포함 된 PageLayout 클래스가 있습니다. 내가 thingsNumberEditor 삽입 값으로 기존 개체에 바인딩하고 싶은

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

그리고 여기. 프로젝트가 시작될 때, Number 값이 null이지만, Editor 입력 후에, 삽입 된 텍스트를 내 클래스 속성 Number에 바인드하려고합니다.

답변

0

기본적으로 모든 페이지 (ContentPage, TabPage 등)는 객체를 할당하거나 더 나은 ViewModel을 바인딩하려는 BindingContext 속성을 가지고 있습니다.

그래서

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

SetBinding() 방법의 두 번째 매개 변수는 컨트롤의 속성에 바인딩 할 당신의 바인딩 컨텍스트의 대상 속성을 지정하는 문자열입니다. 첫 번째 매개 변수는 업데이트해야하는 컨트롤의 속성을 지정합니다. 내가 Text라는 이름의 속성이 선언을 참조하지 않는 한,

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

당신은 정말 두 번째 매개 변수에 대한 "텍스트"이외의 특정 뭔가 의도 :

그래서 나는이 코드 줄 것을 확신 ThingsObject 클래스에 있습니다.

Editor 컨트롤에는 바인딩 할 수있는 Text 속성도 있습니다. 코드는 당신의 Number 속성에 바인딩을 세울이 예에서 매우 비슷합니다 또한 편집기의 BindingContext을 설정해야

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

,하지만 당신은 몇 가지 코드를 저장하는 데 사용할 수있는 트릭이있다 . 컨트롤에 바인딩이 있지만 명시 적으로 설정된 BindingContext이 없으면 BindingContext 값을 찾을 때까지 부모 컨트롤 (또는 부모 등)을 찾습니다.

label1.BindingContext = inputText; 

이 사람 : : 그래서 당신의 예제 코드 줄을 변경하여

다음
page.BindingContext = inputText; 

가 상속 때문에, 명시 적으로 자식 컨트롤의의 BindingContext을 설정할 필요가 없습니다 그것은 부모 페이지 컨테이너에서.

관련 문제