这里有一种方法可以在集合项上添加一个可绑定的索引。我基本上将我的项包装在一个带有索引的容器中,并使用自定义的ObservableCollection来接受这个包装器。
请注意,MoveItem没有被覆盖,但是为了完整的实现,必须覆盖它。
public class IndexedItemContainerCollection<T> : ObservableCollection<IndexedItemContainer<T>>
{
public IndexedItemContainerCollection()
{
}
public IndexedItemContainerCollection(IEnumerable<IndexedItemContainer<T>> collection)
: base(collection)
{
var index = 0;
foreach (var item in this)
{
item.Index = index;
}
}
protected override void InsertItem(int index, IndexedItemContainer<T> item)
{
item.Index = index;
base.InsertItem(index, item);
foreach (var indexedItem in this.Where(x=>x.Index > index))
{
indexedItem.Index++;
}
}
protected override void RemoveItem(int index)
{
base.RemoveItem(index);
foreach (var indexedItem in this.Where(x => x.Index > index))
{
indexedItem.Index--;
}
}
}
public class IndexedItemContainer<T>
{
public int Index { get; set; }
public T Item { get; set; }
}
然后我扩展我的包装类,以获取一个可绑定的属性,我可以控制索引的显示方式:
public class NamedIndexedItemContainer<T> : IndexedItemContainer<T>
{
public string Name
{
get { return string.Format("Item #{0}", Index + 1); }
}
}
使用示例
XAML:
<ComboBox ItemsSource="">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
代码:
private IndexedItemContainerCollection<MyItem> _itemList;
public IndexedItemContainerCollection<MyItem> ItemList
{
get { return _itemList; }
set { _itemList= value; OnPropertyChanged(); }
}
ItemList = new IndexedItemContainerCollection<MyItem>();
var newItem = new NamedIndexedItemContainer<MyItem>() { Item = new MyItem() { ... } };
ItemList.Add(newItem);
当然,任何与实际 MyItem 实例的绑定都必须通过 IndexedItemContainer 的 Item 属性进行。