如何在BindableLayout.ItemsSource中绑定项目索引

时间:2019-04-18 09:11:10

标签: xaml xamarin.forms

我想要一个按钮集合,这些按钮的集合在MyObservableCollection中以文本形式显示其对应项的索引,并执行一个CommandParameter也是该索引的Command。我该如何实现?

<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 个答案:

答案 0 :(得分:1)

让我们以正确的“非hacky”方式来做您在评论中提到的“ hacky” ^^

我将按照以下内容进行构建。首先,我们创建一个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}绑定到此自动设置的索引。

希望这会有所帮助