Aquí es un método que utiliza para añadir un índice que puede unirse en un elemento de la colección. Básicamente envuelvo mi artículo en un contenedor que tiene un índice, y tengo un ObservableCollection personalizado que acepta el envoltorio.
Tenga en cuenta que MoveItem no se reemplaza, pero tendría que ser para una implementación completa.
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; }
}
luego extiendo mi clase de contenedor para obtener una propiedad enlazable que tengo control sobre cómo se muestra el índice:
public class NamedIndexedItemContainer<T> : IndexedItemContainer<T>
{
public string Name
{
get { return string.Format("Item #{0}", Index + 1); }
}
}
Ejemplo de uso
XAML:
<ComboBox ItemsSource="{Binding ItemList}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
Código:
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);
Por supuesto, cualquier unión con la instancia myItem real tendría que pasar por artículo propiedad del IndexedItemContainer.
¡Gracias, funcionó muy bien en mi situación! – Rachel
No hagas esto. Ver http://stackoverflow.com/questions/6511180/wpf-itemscontrol-the-current-listitem-index-in-the-itemssource/17962582#17962582 – bradgonesurfing
Útil, pero comienza en 0, lo que no es muy útil a menos que la interfaz de usuario está diseñada para programadores. Me imagino que la mayoría de la gente que quiere esto quiere que comience en 1. – Chris