Как получить контекст привязки при создании DataTemplate

#xamarin.forms #binding #collectionview #itemssource

Вопрос:

Есть ли способ получить сам контекст привязки в перечисляемом шаблоне?

 this.CollectionView.ItemTemplate = new DataTemplate(() =>
{
    var view = new SubView();
    view.SetBinding(SubView.SourceProperty, new Binding()
    {
        Source = ??? // <- here
    });
    
    return view;
};
 

Примечание:
Path = "." отлично работает на Android. но в iOS источник дублируется.
Я уже проверил, что в CollectionView нет дубликатов.Источник предметов.

Комментарии:

1. Согласно вашему коду, мне не ясно, с какой проблемой вы столкнулись? Если вы хотите использовать привязку collectionview по коду, вы можете посмотреть: xamarin.forms collectionview

2. Спасибо за ответ, Черри Бу. Действие в аргументе конструктора DataTemplate выполнялось столько раз, сколько элементов. Поэтому я представил себе, что будет способ передать сам элемент в качестве аргумента для Действия.

3. Зачем ты это делаешь? Для просмотра коллекции. Табличка, которую я обычно использую, как этот документ , не уверена, хотите ли вы использовать относительную привязку .

Ответ №1:

Я новичок на платформе и надеюсь, что смогу помочь. Я понимаю, что вы хотите получить связывающий контекст каждого элемента в списке. Если я правильно интерпретирую, то это то, что вы можете сделать:

 public partial class NotificationsPage : ContentPageBase
{
    public NotificationsPage()
    {
        InitializeComponent();
        CollectionView.ItemTemplate = new DataTemplate(() =>
        {
            return new Item();
        });
    }
}

public class Item : ContentView
{
    protected override void OnBindingContextChanged()
    {
        base.OnBindingContextChanged();
        if (BindingContext is ItemModel item)
        {
            var name = item.Name;
        }
    }
}

public class ItemModel
{
    public string Name { get; set; }
}
 

DataTemplate не содержит доступного BindingContext, BindingContext передается элементу, содержащему DataTemplate.

Комментарии:

1. Спасибо за ответ, Алексдев. Я понял, что это невозможно.