private void ExportHeadersCore(
                DataGridContext dataGridContext,
                ClipboardExporterBase clipboardExporter,
                int[] exportedVisiblePositions,
                ColumnBase[] columnsByVisiblePosition)
            {
                clipboardExporter.StartHeader(dataGridContext);

                // Ensure the count does not exceeds the columns count
                int exportedVisiblePositionsCount = exportedVisiblePositions.Length;

                exportedVisiblePositionsCount = Math.Min(exportedVisiblePositionsCount, columnsByVisiblePosition.Length);

                for (int i = 0; i < exportedVisiblePositionsCount; i++)
                {
                    int visiblePosition = exportedVisiblePositions[i];

                    // Only export visible data column
                    Column column = columnsByVisiblePosition[visiblePosition] as Column;

                    if (column == null)
                    {
                        continue;
                    }

                    clipboardExporter.StartHeaderField(dataGridContext, column);
                    clipboardExporter.EndHeaderField(dataGridContext, column);
                }

                clipboardExporter.EndHeader(dataGridContext);
            }
      private void ExportHeadersCore( DataGridContext dataGridContext, ClipboardExporterBase clipboardExporter, int[] exportedVisiblePositions,
                                      ColumnBase[] columnsByVisiblePosition )
      {
        clipboardExporter.StartHeader( dataGridContext );

        // Ensure the count does not exceeds the columns count
        int exportedVisiblePositionsCount = exportedVisiblePositions.Length;
        exportedVisiblePositionsCount = Math.Min( exportedVisiblePositionsCount, columnsByVisiblePosition.Length );

        for( int i = 0; i < exportedVisiblePositionsCount; i++ )
        {
          int visiblePosition = exportedVisiblePositions[ i ];

          // Only export visible data column
          Column column = columnsByVisiblePosition[ visiblePosition ] as Column;

          if( column == null )
            continue;

          clipboardExporter.StartHeaderField( dataGridContext, column );
          clipboardExporter.EndHeaderField( dataGridContext, column );
        }

        clipboardExporter.EndHeader( dataGridContext );
      }
      private void ExportDataItemCore( DataGridContext dataGridContext, ClipboardExporterBase clipboardExporter, int itemIndex, object item, int[] exportedVisiblePositions,
                                       ColumnBase[] columnsByVisiblePosition )
      {
        DataGridCollectionViewBase dataGridCollectionViewBase = dataGridContext.ItemsSourceCollection as DataGridCollectionViewBase;

        clipboardExporter.StartDataItem( dataGridContext, item );

        // Ensure the count does not exceeds the columns count
        int exportedVisiblePositionsCount = exportedVisiblePositions.Length;
        exportedVisiblePositionsCount = Math.Min( exportedVisiblePositionsCount, columnsByVisiblePosition.Length );

        HashSet<int> intersectedIndexes = this.GetIntersectedRangesForIndex( dataGridContext, itemIndex, exportedVisiblePositions, exportedVisiblePositionsCount );

        object fieldValue = null;
        Column column = null;

        for( int i = 0; i < exportedVisiblePositionsCount; i++ )
        {
          // Reset field value
          fieldValue = null;

          int visiblePosition = exportedVisiblePositions[ i ];

          // Export null if not intersected by a SelectionRange
          if( intersectedIndexes.Contains( visiblePosition ) )
          {
            // Only export visible data column
            column = columnsByVisiblePosition[ visiblePosition ] as Column;

            if( column == null )
              continue;

            // Use DataGridCollectionView directly since the DataGridItemProperty uses PropertyDescriptor which increase
            // the read of the field value
            DataGridItemPropertyBase dataGridItemProperty = null;

            // Try to get a DataGridItemProperty matching the column FieldName
            // and get the value from it
            if( dataGridCollectionViewBase != null )
            {
              dataGridItemProperty = dataGridCollectionViewBase.ItemProperties[ column.FieldName ];

              if( dataGridItemProperty != null )
              {
                fieldValue = dataGridItemProperty.GetValue( item );
              }
            }

            // If none was found, create a BindingPathValueExtractor from this column
            if( ( dataGridCollectionViewBase == null ) || ( dataGridItemProperty == null ) )
            {
              // We don't have a DataGridCollectionView, use a BindingPathValueExtractor
              // to create a binding to help us get the value for the Column in the 
              // data item
              BindingPathValueExtractor extractorForRead = null;

              if( m_columnToBindingPathExtractor.TryGetValue( column, out extractorForRead ) == false )
              {
                extractorForRead = dataGridContext.GetBindingPathExtractorForColumn( column, item );
                m_columnToBindingPathExtractor.Add( column, extractorForRead );
              }

              fieldValue = extractorForRead.GetValueFromItem( item );
            }
          }

          if( fieldValue != null )
          {
            //Verify if the value should be converted to the displayed value for exporting.
            ForeignKeyConfiguration foreignKeyConfiguration = column.ForeignKeyConfiguration;

            if( foreignKeyConfiguration != null && foreignKeyConfiguration.UseDisplayedValueWhenExporting )
            {
              fieldValue = foreignKeyConfiguration.GetDisplayMemberValue( fieldValue );
            }
            else if( column.DisplayedValueConverter != null )
            {
              fieldValue = column.DisplayedValueConverter.Convert( fieldValue, typeof( object ), column.DisplayedValueConverterParameter, column.GetCulture( column.DisplayedValueConverterCulture ) );
            }
            else if( !string.IsNullOrEmpty( column.CellContentStringFormat ) )
            {
              fieldValue = string.Format( column.GetCulture(), column.CellContentStringFormat, fieldValue );
            }
          }

          clipboardExporter.StartDataItemField( dataGridContext, column, fieldValue );
          clipboardExporter.EndDataItemField( dataGridContext, column, fieldValue );
        }

        clipboardExporter.EndDataItem( dataGridContext, item );
      }
      private void ExportDataItemCore(
        DataGridContext dataGridContext,
        ClipboardExporterBase clipboardExporter,
        int itemIndex,
        object item,
        int[] exportedVisiblePositions,
        ColumnBase[] columnsByVisiblePosition )
      {
        DataGridCollectionViewBase dataGridCollectionViewBase =
          dataGridContext.ItemsSourceCollection as DataGridCollectionViewBase;

        clipboardExporter.StartDataItem( dataGridContext, item );

        // Ensure the count does not exceeds the columns count
        int exportedVisiblePositionsCount = exportedVisiblePositions.Length;
        exportedVisiblePositionsCount = Math.Min( exportedVisiblePositionsCount, columnsByVisiblePosition.Length );

        HashSet<int> intersectedIndexes = this.GetIntersectedRangesForIndex( dataGridContext,
            itemIndex,
            exportedVisiblePositions,
            exportedVisiblePositionsCount );

        object fieldValue = null;
        Column column = null;

        for( int i = 0; i < exportedVisiblePositionsCount; i++ )
        {
          int visiblePosition = exportedVisiblePositions[ i ];

          // Export null if not intersected by a SelectionRange
          if( intersectedIndexes.Contains( visiblePosition ) )
          {
            // Only export visible data column
            column = columnsByVisiblePosition[ visiblePosition ] as Column;

            if( column == null )
              continue;

            // Reset field value
            fieldValue = null;

            // Use DataGridCollectionView directly since the DataGridItemProperty uses PropertyDescriptor which increase
            // the read of the field value
            DataGridItemPropertyBase dataGridItemProperty = null;

            // Try to get a DataGridItemProperty matching the column FieldName
            // and get the value from it
            if( dataGridCollectionViewBase != null )
            {
              dataGridItemProperty = dataGridCollectionViewBase.ItemProperties[ column.FieldName ];

              if( dataGridItemProperty != null )
                fieldValue = dataGridItemProperty.GetValue( item );
            }

            // If none was found, create a BindingPathValueExtractor from this column
            if( ( dataGridCollectionViewBase == null ) || ( dataGridItemProperty == null ) )
            {
              // We don't have a DataGridCollectionView, use a BindingPathValueExtractor
              // to create a binding to help us get the value for the Column in the 
              // data item
              BindingPathValueExtractor extractorForRead = null;

              if( m_columnToBindingPathExtractor.TryGetValue( column, out extractorForRead ) == false )
              {
                extractorForRead = dataGridContext.GetBindingPathExtractorForColumn( column, item );
                m_columnToBindingPathExtractor.Add( column, extractorForRead );
              }

              fieldValue = extractorForRead.GetValueFromItem( item );
            }
          }

          clipboardExporter.StartDataItemField( dataGridContext, column, fieldValue );
          clipboardExporter.EndDataItemField( dataGridContext, column, fieldValue );
        }

        clipboardExporter.EndDataItem( dataGridContext, item );
      }
            private void ExportDataItemCore(
                DataGridContext dataGridContext,
                ClipboardExporterBase clipboardExporter,
                int itemIndex,
                object item,
                int[] exportedVisiblePositions,
                ColumnBase[] columnsByVisiblePosition)
            {
                DataGridCollectionViewBase dataGridCollectionViewBase =
                    dataGridContext.ItemsSourceCollection as DataGridCollectionViewBase;

                clipboardExporter.StartDataItem(dataGridContext, item);

                // Ensure the count does not exceeds the columns count
                int exportedVisiblePositionsCount = exportedVisiblePositions.Length;

                exportedVisiblePositionsCount = Math.Min(exportedVisiblePositionsCount, columnsByVisiblePosition.Length);

                HashSet <int> intersectedIndexes = this.GetIntersectedRangesForIndex(dataGridContext,
                                                                                     itemIndex,
                                                                                     exportedVisiblePositions,
                                                                                     exportedVisiblePositionsCount);

                object fieldValue = null;
                Column column     = null;

                for (int i = 0; i < exportedVisiblePositionsCount; i++)
                {
                    int visiblePosition = exportedVisiblePositions[i];

                    // Export null if not intersected by a SelectionRange
                    if (intersectedIndexes.Contains(visiblePosition))
                    {
                        // Only export visible data column
                        column = columnsByVisiblePosition[visiblePosition] as Column;

                        if (column == null)
                        {
                            continue;
                        }

                        // Reset field value
                        fieldValue = null;

                        // Use DataGridCollectionView directly since the DataGridItemProperty uses PropertyDescriptor which increase
                        // the read of the field value
                        DataGridItemPropertyBase dataGridItemProperty = null;

                        // Try to get a DataGridItemProperty matching the column FieldName
                        // and get the value from it
                        if (dataGridCollectionViewBase != null)
                        {
                            dataGridItemProperty = dataGridCollectionViewBase.ItemProperties[column.FieldName];

                            if (dataGridItemProperty != null)
                            {
                                fieldValue = dataGridItemProperty.GetValue(item);
                            }
                        }

                        // If none was found, create a BindingPathValueExtractor from this column
                        if ((dataGridCollectionViewBase == null) || (dataGridItemProperty == null))
                        {
                            // We don't have a DataGridCollectionView, use a BindingPathValueExtractor
                            // to create a binding to help us get the value for the Column in the
                            // data item
                            BindingPathValueExtractor extractorForRead = null;

                            if (m_columnToBindingPathExtractor.TryGetValue(column, out extractorForRead) == false)
                            {
                                extractorForRead = dataGridContext.GetBindingPathExtractorForColumn(column, item);
                                m_columnToBindingPathExtractor.Add(column, extractorForRead);
                            }

                            fieldValue = extractorForRead.GetValueFromItem(item);
                        }
                    }

                    clipboardExporter.StartDataItemField(dataGridContext, column, fieldValue);
                    clipboardExporter.EndDataItemField(dataGridContext, column, fieldValue);
                }

                clipboardExporter.EndDataItem(dataGridContext, item);
            }
            private void ExportDataItemCore(DataGridContext dataGridContext, ClipboardExporterBase clipboardExporter, int itemIndex, object item,
                                            int[] exportedVisiblePositions, ColumnBase[] columnsByVisiblePosition)
            {
                var dataGridCollectionViewBase = dataGridContext.ItemsSourceCollection as DataGridCollectionViewBase;

                clipboardExporter.StartDataItem(dataGridContext, item);

                // Ensure the count does not exceeds the columns count
                var exportedVisiblePositionsCount = exportedVisiblePositions.Length;

                exportedVisiblePositionsCount = Math.Min(exportedVisiblePositionsCount, columnsByVisiblePosition.Length);

                var intersectedIndexes = this.GetIntersectedRangesForIndex(dataGridContext, itemIndex, exportedVisiblePositions, exportedVisiblePositionsCount);

                for (int i = 0; i < exportedVisiblePositionsCount; i++)
                {
                    var fieldValue      = default(object);
                    var column          = default(Column);
                    var visiblePosition = exportedVisiblePositions[i];

                    // Export null if not intersected by a SelectionRange
                    if (intersectedIndexes.Contains(visiblePosition))
                    {
                        // Only export visible data column
                        column = columnsByVisiblePosition[visiblePosition] as Column;

                        if (column == null)
                        {
                            continue;
                        }

                        // Use DataGridCollectionView directly since the DataGridItemProperty uses PropertyDescriptor which increase the read of the field value
                        var dataGridItemProperty = default(DataGridItemPropertyBase);

                        // Try to get a DataGridItemProperty matching the column FieldName and get the value from it
                        if (dataGridCollectionViewBase != null)
                        {
                            dataGridItemProperty = ItemsSourceHelper.GetItemPropertyFromProperty(dataGridCollectionViewBase.ItemProperties, column.FieldName);

                            if (dataGridItemProperty != null)
                            {
                                fieldValue = ItemsSourceHelper.GetValueFromItemProperty(dataGridItemProperty, item);
                            }
                        }

                        // If none was found, create a BindingPathValueExtractor from this column
                        if ((dataGridCollectionViewBase == null) || (dataGridItemProperty == null))
                        {
                            // We don't have a DataGridCollectionView, use a BindingPathValueExtractor to create a binding to help us get the value for the Column in the data item
                            var extractorForRead = default(BindingPathValueExtractor);

                            if (m_columnToBindingPathExtractor.TryGetValue(column, out extractorForRead) == false)
                            {
                                extractorForRead = dataGridContext.GetBindingPathExtractorForColumn(column, item);
                                m_columnToBindingPathExtractor.Add(column, extractorForRead);
                            }

                            fieldValue = extractorForRead.GetValueFromItem(item);
                        }
                    }

                    if (fieldValue != null)
                    {
                        //Verify if the value should be converted to the displayed value for exporting.
                        var foreignKeyConfiguration = column.ForeignKeyConfiguration;
                        if (foreignKeyConfiguration != null && foreignKeyConfiguration.UseDisplayedValueWhenExporting)
                        {
                            fieldValue = foreignKeyConfiguration.GetDisplayMemberValue(fieldValue);
                        }
                        else
                        {
                            var valueConverter = column.DisplayedValueConverter;
                            if (valueConverter != null)
                            {
                                fieldValue = valueConverter.Convert(fieldValue, typeof(object), column.DisplayedValueConverterParameter,
                                                                    column.GetCulture(column.DisplayedValueConverterCulture));
                            }
                            else
                            {
                                var valueFormat = column.CellContentStringFormat;
                                if (!string.IsNullOrEmpty(valueFormat))
                                {
                                    fieldValue = string.Format(column.GetCulture(), valueFormat, fieldValue);
                                }
                            }
                        }
                    }

                    clipboardExporter.StartDataItemField(dataGridContext, column, fieldValue);
                    clipboardExporter.EndDataItemField(dataGridContext, column, fieldValue);
                }

                clipboardExporter.EndDataItem(dataGridContext, item);
            }