如何重新编号ObservableCollection <keyvaluepair <int,string =“”> </keyvaluepair <int,>

时间:2014-12-04 12:20:44

标签: c# .net observablecollection key-value

我正在使用键/值绑定ObservableCollection - &gt; int(index)和字符串到ItemsControl中的文本框。

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

如果单击ItemsControl中的按钮,则可以删除Collection中的项目。

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”

我该怎么做?

2 个答案:

答案 0 :(得分: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重载。假定从零开始编号。

答案 1 :(得分: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++;
}

但是,您可以从项目删除的数字中移动项目