【问题标题】:Xamarin.Forms Data Binding to class propertiesXamarin.Forms 数据绑定到类属性
【发布时间】:2016-09-30 19:41:12
【问题描述】:

我知道有一种方法可以将页面StackLayout 变量的数据绑定到类属性,但不幸的是我没有找到任何有关它的资源。我知道如何实现简单的绑定。例如:在 EditorLabel 之间。但是如何将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

【问题讨论】:

    标签: c# class data-binding xamarin xamarin.forms


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      Editor 控件还有一个可以绑定的Text 属性。代码看起来非常相似,在此示例中,它将建立与您的 Number 属性的绑定:

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

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

      label1.BindingContext = inputText;
      

      到这里:

      page.BindingContext = inputText;
      

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

      【讨论】:

        猜你喜欢
        • 2014-11-21
        • 2014-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-20
        • 1970-01-01
        相关资源
        最近更新 更多