Xamarin Forms - привязывает элементы управления пользовательского интерфейса к свойствам объекта (эти объекты находятся в списке) - PullRequest
0 голосов
/ 23 марта 2020

В коде позади я l oop через список, который определен в модели представления. Для каждого элемента я проверяю, какой тип элемента управления (Entry, Picker et c ..) мне нужно создать. Проблема в том, что я не знаю, как связать эти элементы управления со свойствами из объектов в списке, определенном в модели представления.

Мой код:

        // Create controls dynamically
        for (int i = 0; i < (BindingContext as CheckListEditViewModel).CheckListItems.Count; i++)
        {
            var item = (BindingContext as CheckListEditViewModel).CheckListItems[i];

            var description = new Label()
            {
                Text = item.Description
            };
            stack.Children.Add(description);

            if ((item.ChecklistItemType == Domain.ChecklistItemType.Number))
            {
                var numerEntry = new Entry();
                numerEntry.Keyboard = Keyboard.Numeric;

                numerEntry.SetBinding(Entry.TextProperty, "item.Value"); // How should I do this??

                stack.Children.Add(numerEntry);
            }
            else if ((item.ChecklistItemType == Domain.ChecklistItemType.Email))
            {
                var numerEntry = new Entry();
                numerEntry.Keyboard = Keyboard.Email;
                stack.Children.Add(numerEntry);
            }
        }

        Content = stack;

Как мне связать эти UI контролирует со свойствами в объекте item? (PS: объект предмета взят из списка)

Ответы [ 2 ]

1 голос
/ 23 марта 2020

Объект item неизвестен вашему numberEntry объекту. Вы не можете ожидать, что SetBinding волшебным образом поймет, что вы имеете в виду под item - это может быть что угодно. Чтобы иметь смысл SetBinding, необходимо установить BindingContext вашего контроля. В вашем случае было бы разумно установить его на item

var numerEntry = new Entry();
numerEntry.Keyboard = Keyboard.Numeric;

numerEntry.SetBinding(Entry.TextProperty, path: "Value");
numerEntry.BindingContext = item;

stack.Children.Add(numerEntry);

, поскольку параметр path (записанный явно для пояснения) указывает путь к свойству относительно BindingContext, "item.Value "необходимо изменить на "Value".

0 голосов
/ 24 марта 2020

Согласно вашему описанию, вы oop элемент из списка и хотите привязать каждый элемент к пользовательскому интерфейсу, я делаю код в соответствии с вашим кодом, вы можете посмотреть:

 public Page33()
    {
        InitializeComponent();

        this.BindingContext = new CheckListEditViewModel();

        StackLayout stack = new StackLayout();

        for(int i=0;i<(BindingContext as CheckListEditViewModel).CheckListItems.Count;i++)
        {
            var item = (BindingContext as CheckListEditViewModel).CheckListItems[i];

            var description = new Label()
            {
                Text = item.Description
            };
            stack.Children.Add(description);

            if ((item.ChecklistItemType == "Number"))
            {
                var numerEntry = new Entry();
                numerEntry.Keyboard = Keyboard.Numeric;

                numerEntry.SetBinding(Entry.TextProperty, new Binding("value",BindingMode.TwoWay,source:item));

                stack.Children.Add(numerEntry);
            }
            else if ((item.ChecklistItemType == "Email"))
            {
                var numerEntry = new Entry();
                numerEntry.Keyboard = Keyboard.Email;
                numerEntry.SetBinding(Entry.TextProperty, new Binding("value", BindingMode.TwoWay, source: item));
                stack.Children.Add(numerEntry);
            }
        }
        this.Content = stack;
    }
}

public class CheckListEditViewModel:ViewModelBase
{
    private List<EditModel> _CheckListItems;
    public List<EditModel> CheckListItems
    {
        get { return _CheckListItems; }
        set
        {
            _CheckListItems = value;
            RaisePropertyChanged("CheckListItems");
        }
    }
    public CheckListEditViewModel()
    {
        CheckListItems = new List<EditModel>();
        CheckListItems.Add(new EditModel() {Description="one model",ChecklistItemType="Email",value="123@outlook.com" });
        CheckListItems.Add(new EditModel() { Description = "two model", ChecklistItemType = "Number",value="12345" });
        CheckListItems.Add(new EditModel() { Description = "three model", ChecklistItemType = "Email",value="345@outlook.com" });
        CheckListItems.Add(new EditModel() { Description = "four model", ChecklistItemType = "Number",value="567" });
    }
}
public class EditModel
{
    public string Description { get; set; }
    public string ChecklistItemType { get; set; }
    public string value { get; set; }
}

Я устанавливаю текущий ContentPage BindingContext = new CheckListEditViewModel (), затем l oop каждый элемент списка, затем элемент является источником текущего элемента управления.

enter image description here

...