2014-12-04 3 views
1

Я привязываю ObservableCollection с ключом/значением -> int (индекс) и строку к текстовому полю в ItemsControl.Как перенумеровать ObservableCollection <KeyValuePair <int, string>

<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) коллекции, например:

  • Collection перед удалением элемента: 0 - "ааа", 1 - "BBB", 2 - " ссс», 3 - "дДД"
  • Коллекция после удаления элемента: 0 - "ааа", 2 - "ссс", 3 - "дДД"
  • коллекции после перенумерации: 0 - "ааа", - "ccc", - "ddd"

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

+0

Вы хотите, чтобы товары сохраняли прежний заказ? – Ahmad

+4

Вы уверены, что вам нужен KeyValuePair вообще, кажется, что простой перечислимый будет ... – SWeko

ответ

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

Не должен ли этот порядок ключом, а не значением? Хотя пример OP будет работать в любом случае. – juharr

+0

Спасибо @juharr - хорошая точка - исправлена. – StuartLC

+0

Спасибо за ваш ответ. Оно работает. И последний вопрос. Если у меня есть коллекция с ключом/значениями: 0/a, 2/c, 1/b, как я могу их отсортировать, не изменяя значение: 0/a, 1/c, 2/b? – Stampy

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 .Key' только для чтения. Поэтому для создания этой работы вам нужно создать новый 'KeyValuePair '. – juharr

+0

спасибо, Кажется, я должен удалить свой ответ, если не было исправлено – Ahmad

+0

@juharr, как насчет моего нового отредактированного ответа? – Ahmad

Смежные вопросы