我想要一个按钮集合,这些按钮的集合在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>
答案 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}
绑定到此自动设置的索引。
希望这会有所帮助