Как привязать индекс элемента в BindableLayout.ItemsSource - PullRequest
0 голосов
/ 18 апреля 2019

Мне нужна коллекция кнопок, которые показывают индекс соответствующего элемента в MyObservableCollection в виде текста, и выполняют команду с CommandParameter, также являющимся этим индексом. Как мне этого добиться?

<StackLayout BindableLayout.ItemsSource="{Binding MyObservableCollection}">
  <BindableLayout.ItemTemplate>
    <DataTemplate>
      <Button Text="{Binding [index of the item in MyObservableCollection]}" 
              Command="{Binding MyCommand}"
              CommandParameter="{Binding [index of the item in MyObservableCollection]}" />
    </DataTemplate>
  </BindableLayout.ItemTemplate>
</StackLayout>

1 Ответ

1 голос
/ 18 апреля 2019

Итак, давайте сделаем «хакерскую» вещь, которую вы упомянули в комментариях, правильным «нехакерским» способом ^^

Я бы построил что-то вроде следующего. Сначала мы создаем IIndexable интерфейс:

public interface IIndexable
{
    int Index { get; set; }
}

Теперь мы создаем собственную реализацию ObservableCollection<T> следующим образом:

public class IndexableObservableCollection<T> : ObservableCollection<T> where T : IIndexable
{
    protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
    {
        switch (e.Action)
        {
            case NotifyCollectionChangedAction.Add:
            case NotifyCollectionChangedAction.Replace:
            case NotifyCollectionChangedAction.Move:
                for (int i = 0; i < e.NewItems.Count; i++)
                    if (e.NewItems[i] is IIndexable indexableItem)
                        indexableItem.Index = e.NewStartingIndex + i;
                break;
        }
        base.OnCollectionChanged(e);
    }
}

Пока я выполнил только самую базовую реализацию в коммутаторе (если в этом случае коммутатор можно заменить на оператор if, но это облегчит вам реализацию всех опций), вы Я должен сам заглянуть в NotifyCollectionChangedEventArgs и реализовать соответствующие дела.

После этого просто есть классы, которые вы хотите иметь возможность показывать индекс реализации интерфейса IIndexable и помещать их в IndexableObservableCollection, и это автоматически установит их индекс при добавлении. в xaml вы можете просто использовать {Binding Index} для привязки к этому автоматически установленному индексу.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...