Hier ist eine Methode, die ich verwendet, um einen bindungsfähigen Index für eine Sammlung Element hinzuzufügen. Ich verpacke mein Element im Grunde in einen Container mit einem Index und verwende eine benutzerdefinierte ObservableCollection, die den Wrapper akzeptiert.
Beachten Sie, dass MoveItem nicht überschrieben wird, aber für eine vollständige Implementierung erforderlich wäre.
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; }
}
ich dann meine Wrapper-Klasse erweitern, um eine bindbare Eigenschaft zu erhalten, die ich Kontrolle darüber haben, wie der Index angezeigt wird:
public class NamedIndexedItemContainer<T> : IndexedItemContainer<T>
{
public string Name
{
get { return string.Format("Item #{0}", Index + 1); }
}
}
Probe Nutzungs
XAML:
<ComboBox ItemsSource="{Binding ItemList}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
Code:
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);
Natürlich kann jedes mit der tatsächlichen MyItem Instanz verbindlich müßte die IndexedItemContainer geht durch Artikel Eigenschaft.
Vielen Dank, dass nur gut in meiner Situation gearbeitet! – Rachel
Tun Sie das nicht. Siehe http://stackoverflow.com/questions/6511180/wpf-itemscontrol-the-current-listitem-index-in-the-itemssource/17962582#17962582 – bradgonesurfing
hilfreich, aber es beginnt bei 0, was es sei denn, nicht sehr nützlich ist Die Benutzeroberfläche ist für Programmierer gedacht. Ich stelle mir die meisten Leute wollen dies wollen es bei 1. – Chris