Dưới đây là một phương pháp tôi sử dụng để thêm một chỉ số bindable trên một mục bộ sưu tập. Tôi về cơ bản bọc mục của tôi trong một container có một chỉ mục, và có một ObservableCollection tùy chỉnh chấp nhận trình bao bọc.
Lưu ý rằng MoveItem không bị ghi đè, nhưng phải thực hiện đầy đủ.
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; }
}
sau đó tôi mở rộng lớp wrapper của tôi để có được một tài sản bindable mà tôi có thể kiểm soát như thế nào chỉ số được hiển thị:
public class NamedIndexedItemContainer<T> : IndexedItemContainer<T>
{
public string Name
{
get { return string.Format("Item #{0}", Index + 1); }
}
}
Sample Cách sử dụng
XAML:
<ComboBox ItemsSource="{Binding ItemList}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
Mã số:
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);
Tất nhiên, mọi ràng buộc với cá thể MyItem thực tế sẽ phải đi qua thuộc tính của mục IndexedItemContainer.
Cảm ơn bạn, điều đó chỉ hoạt động tốt trong hoàn cảnh của tôi! – Rachel
Đừng làm điều này. Xem http://stackoverflow.com/questions/6511180/wpf-itemscontrol-the-current-listitem-index-in-the-itemssource/17962582#17962582 – bradgonesurfing
Hữu ích, nhưng nó bắt đầu ở mức 0, điều này không hữu ích trừ khi giao diện người dùng được thiết kế cho các lập trình viên. Tôi tưởng tượng hầu hết mọi người muốn điều này muốn nó bắt đầu tại 1. – Chris