【问题标题】:Collection vs ListCollectionView index集合与 ListCollectionView 索引
【发布时间】:2017-09-07 07:54:04
【问题描述】:

我有一个 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 上的GetItemAt(Int32) 方法吗?
  • 这对绑定不起作用?因为它实际上是一个字符串,所以我会得到错误:BindingExpression path error: '[]' property not found on 'object' ''ListCollectionView' (HashCode=13293450)'。 BindingExpression:Path=EmployeeCol.GetIndex(1).Name
  • 从你得到的异常中问题很明显,不是吗?! GetItemAt(Int32) 的返回值是 System.Object 类型,您需要将其类型转换为预期类型。例如:Employee 在您的情况下。

标签: c# wpf listcollectionview


【解决方案1】:

ListCollectionView 提供一个方法object GetItemAt(Int32) 来索引集合。

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

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

【讨论】:

    【解决方案2】:

    ListCollectionView 类的SourceCollection 属性返回一个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>;
    

    【讨论】:

      猜你喜欢
      • 2014-03-23
      • 1970-01-01
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      • 2012-09-06
      • 2014-05-11
      • 2021-09-07
      • 1970-01-01
      相关资源
      最近更新 更多