Итак, давайте сделаем «хакерскую» вещь, которую вы упомянули в комментариях, правильным «нехакерским» способом ^^
Я бы построил что-то вроде следующего. Сначала мы создаем 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}
для привязки к этому автоматически установленному индексу.
Надеюсь, это поможет