集合与 ListCollectionView 索引

Collection vs ListCollectionView index

我有一个 ValueConverter,它构建了一个曾经有一个 observableCollection 的数据透视表

 var employees = values[0] as ObservableCollection<Employee>;

在这个转换器中,我这样设置绑定:

foreach( var employee in employees) {
  int indexer = periods.IndexOf( period );

  var tb = new TextBlock( ) {
    TextAlignment = TextAlignment.Center,
  };

  tb.SetBinding( TextBlock.TextProperty, new Binding( ) {
    ElementName = "root",
    Path = new PropertyPath( "EmployeesCol[" + indexer.ToString( ) + "]." + Extensions.GetPropertyName( ( ) => employee.Name ) )
  } );
}

现在我的问题是绑定过去工作正常,路径如下所示:

EmployeesCol[1].Name

但我已经将 ObservableCollection 更改为 ListCollectionView 所以这个:

var employees = values[0] as ObservableCollection<Employee>;

变成了这个:

var employees( (ListCollectionView) values[0] ).Cast<Employee>( ).ToList( );

现在这不再有效了:

EmployeesCol[1].Name

您不能像这样在 ListCollectionView 上使用索引(索引器),但是我怎样才能在 ListCollectionView 上使用索引器绑定到正确的项目?

ListCollectionView provide a method object GetItemAt(Int32) 对集合进行索引。

只是一个基于评论的伪代码供您理解(当然需要进行空引用检查等!!):

var result = (EmployeesCol.GetItemAt(1) as Employee).Name;

SourceCollection 属性 的 ListCollectionView class returns 一个 IEnumerable 你可以调用 ElementAt 方法或从以下位置创建列表:

var employees = theListCollectionView.SourceCollection.OfType<Employee>().ToList();
var employee = employees[0];
...
var employees = theListCollectionView.SourceCollection.OfType<Employee>();
var employee = employee.ElementAt(0);

您还可以将 SourceCollection 转换为源集合的任何类型,例如列表:

var employees = theListCollectionView.SourceCollection as IList<Employee>;