我知道有一种方法可以将页面StackLayout
变量的数据绑定到类属性,但遗憾的是我找不到任何有关它的资源。我知道如何实现简单的绑定。例如:Editor
和Label
之间。但是如何将Editor
输入文本绑定到类属性:string Number {get; set;}
。这是我的班级:
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; }
}
这是我的PageLayout类,其中包含StackLayout实现,变量和它们之间的绑定。
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;
}
}
在这里,我想将现有对象things
Number
绑定到Editor
插入的值。因为项目启动时Number
值为null
,但在Editor
输入后我想将插入的文本绑定到我的类属性Number
。
答案 0 :(得分:1)
SetBinding()
方法的第二个参数是一个字符串,它指定您希望绑定到控件属性的绑定上下文的目标属性。第一个参数指定应更新的控件的属性。
所以我很确定在这行代码中:
label1.SetBinding(Label.TextProperty, "Text");
你真的想要特定的东西而不是&#34; Text&#34;对于第二个参数,因为我没有在Text
类上看到名为ThingsObject
的属性。
Editor控件还有一个Text
属性,您可以绑定它。代码看起来非常相似,在此示例中将建立与Number
属性的绑定:
inputText.SetBinding(Editor.TextProperty, "Number");
您还需要设置编辑器的BindingContext
,但您可以使用一些技巧来保存一些代码。如果控件具有绑定但没有显式设置BindingContext
,则它将查找其父控件(或其父控件,依此类推),直到找到BindingContext值。因此,通过更改示例中的以下代码行:
label1.BindingContext = inputText;
对此:
page.BindingContext = inputText;
然后,您不需要显式设置任何子控件的BindingContext
,因为它们将从父页面容器继承它。
答案 1 :(得分:0)
基本上每个页面(ContentPage,TabPage等)都有一个属性BindingContext
,您可以在其中分配对象或更好的要绑定的ViewModel。
所以
public class Page1 : ContentPage
{
public Page1()
{
BindingContext = new ThingsObject();
var lbl = new Label();
lbl.SetBinding(Label.TextProperty, "Number");
Content = new StackLayout
{
Children = {
lbl
}
};
}
}