繁体   English   中英

Xamarin.Forms数据绑定到类属性

[英]Xamarin.Forms Data Binding to class properties

我知道有一种方法可以将页面StackLayout变量的数据绑定到类属性,但是不幸的是我找不到任何有关它的资源。 我知道如何实现简单的绑定。 例如:在EditorLabel之间。 但是如何将Editor输入文本绑定到类属性ex .: string Number {get; set;} 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 to Editor插入值。 因为当项目开始时, Number值为null ,但是在Editor输入之后,我想将插入的文本绑定到类属性Number

基本上,每个页面(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
                }
            };
        }
    }

SetBinding()方法的第二个参数是一个字符串,用于指定您希望绑定到控件属性的绑定上下文的目标属性。 第一个参数指定应更新的控件的属性。

所以我很确定在这行代码中:

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

您确实打算为第二个参数指定“文本”以外的其他内容,因为我没有在ThingsObject类上声明一个名为Text的属性。

编辑器控件还具有可以绑定的Text属性。 该代码看起来非常相似,在此示例中,该代码将建立对您的Number属性的绑定:

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

您还需要设置编辑器的BindingContext ,但是有一个技巧可以用来保存一些代码。 如果控件具有绑定但没有显式设置BindingContext ,则它将查找其父控件(或其父控件,依此类推),直到找到BindingContext值为止。 因此,通过在示例中更改以下代码行:

label1.BindingContext = inputText;

对此:

page.BindingContext = inputText;

然后,您无需显式设置任何子控件的BindingContext ,因为它们将从父页面容器继承它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM