Как изменить нумерацию ObservableCollection <KeyValuePair <int, string>

1

Я привязываю ObservableCollection с ключом/значением → int (индекс) и строку к текстовому полю в ItemControl.

<TextBox Text="{Binding Path=Value , Mode=OneWay}" />

Если вы нажмете кнопку в ItemsControl, вы можете удалить элемент в коллекции.

private ObservableCollection<KeyValuePair<int, String>> testlist;

public ObservableCollection<KeyValuePair<int, String>> TestList
{
    get { return testlist;  }
    set {
        testlist = value;
        NotifyPropertyChanged("TestList");
    }
}

public void DeleteItem(int index)
{
    TestList.RemoveAt(index);
}

Теперь я хочу перенумеровать индекс (int) коллекции, например:

  • Сбор перед удалением элемента: 0 - "aaa", 1 - "bbb", 2 - "ccc", 3 - "ddd"
  • Сбор после удаления предмета: 0 - "aaa", 2 - "ccc", 3 - "ddd"
  • Коллекция после перенумерации: 0 - "aaa", 1 - "ccc", 2 - "ddd"

Как я могу это сделать?

  • 0
    Вы хотите, чтобы товары сохраняли прежний порядок?
  • 4
    Вы уверены, что вам нужен KeyValuePair, похоже, что простое перечислимое подойдет ...
Теги:
observablecollection
key-value

2 ответа

3
Лучший ответ

Создайте новый ObservableCollection после удаления элемента:

Testlist.RemoveAt(1);
Testlist = new ObservableCollection<KeyValuePair<int, string>>(Testlist
    .OrderBy(kvp => kvp.Key)
    .Select((kvp, seq) => new KeyValuePair<int, String>(seq, kvp.Value)));

Заметки

  • OrderBy сохраняет заказ
  • Используйте Select перегрузку, которая обеспечивает индекс элемента. Предполагается нумерация с нуля.
  • 0
    Не должен ли этот порядок по ключу, а не по значению? Хотя пример ОП будет работать в любом случае.
  • 0
    Спасибо @juharr - хорошая точка - исправлено.
Показать ещё 4 комментария
0

Вы можете сделать это с помощью foreach, но перед этим вам нужно отсортировать их, так как ключ только для чтения, вы должны создать новую коллекцию

// Acquire keys and sort them.
var list = ObservableCollection.Keys.ToList();
list.Sort();

int i = 0;
var newList = new ObservableCollection<KeyValuePair<int, string>>();
foreach (var key in list)
{
     newList.Add(new KeyValuePair<int, string>(i, ObservableCollection[key].Value));
     i++;
}

Однако вы можете перенести элементы с номера, на котором был удален элемент

  • 2
    KeyValuePair<K,V>.Key только для чтения. Таким образом, вы должны создать новый KeyValuePair<int, string> чтобы это работало.
  • 0
    спасибо, кажется, я должен удалить свой ответ, если не предложено исправление
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню