public IEnumerable <DataPropertyDescriptor> GetItemProperties(IEnumerable <RowItem> rowItems) { var columnNames = new HashSet <string>(); var propertyDescriptors = new List <DataPropertyDescriptor>(); var pivotDisplayColumns = new Dictionary <PivotKey, List <DisplayColumn> >(); var rowItemsArray = rowItems as RowItem[] ?? rowItems.ToArray(); foreach (var displayColumn in ViewInfo.DisplayColumns) { if (displayColumn.ColumnSpec.Hidden) { continue; } var pivotColumn = PivotColumns.LastOrDefault(pc => displayColumn.PropertyPath.StartsWith(pc.PropertyPath)); ICollection <PivotKey> pivotKeys = null; if (pivotColumn != null) { pivotKeys = GetPivotKeys(pivotColumn.PropertyPath, rowItemsArray); } if (pivotKeys == null) { propertyDescriptors.Add(new ColumnPropertyDescriptor(displayColumn, MakeUniqueName(columnNames, displayColumn.PropertyPath))); continue; } foreach (var value in pivotKeys) { List <DisplayColumn> columns; if (!pivotDisplayColumns.TryGetValue(value, out columns)) { columns = new List <DisplayColumn>(); pivotDisplayColumns.Add(value, columns); } columns.Add(displayColumn); } } var allPivotKeys = pivotDisplayColumns.Keys.ToArray(); Array.Sort(allPivotKeys, PivotKey.GetComparer(ViewInfo.DataSchema)); foreach (var pivotKey in allPivotKeys) { foreach (var pivotColumn in pivotDisplayColumns[pivotKey]) { var qualifiedPropertyPath = PivotKey.QualifyPropertyPath(pivotKey, pivotColumn.PropertyPath); var columnName = MakeUniqueName(columnNames, qualifiedPropertyPath); propertyDescriptors.Add(new ColumnPropertyDescriptor(pivotColumn, columnName, qualifiedPropertyPath, pivotKey)); } } return(propertyDescriptors); }