/// <summary>
        /// Builds collectionSource DetailDescriptions.ItemProperties and collection of detail columns.
        /// </summary>
        /// <param name="collectionSource"></param>
        /// <param name="xceedControl"></param>
        /// <param name="detail"></param>
        public void BuildDetailStructure(DataGridCollectionViewSource collectionSource, DataGridControl xceedGrid,
                                          DetailConfiguration detail)
        {
            Debug.Assert(null != collectionSource.DetailDescriptions);
            Debug.Assert(1 == collectionSource.DetailDescriptions.Count);

            _BuildCollectionSource(collectionSource.DetailDescriptions[0].ItemProperties);
            _BuildColumnsCollection(detail.Columns);

            // Add stops as detail of route.
            xceedGrid.DetailConfigurations.Clear();
            xceedGrid.DetailConfigurations.Add(detail);

            // NOTE: Set this property so that columns with custom order properties from default
            // settings were not added to grid automatically.
            xceedGrid.DetailConfigurations[0].AutoCreateColumns = false;

            // Collapse all detail and reexpand it.
            List<DataGridContext> dataGridContexts = new List<DataGridContext>(xceedGrid.GetChildContexts());
            foreach (DataGridContext dataGridContext in dataGridContexts)
            {
                dataGridContext.ParentDataGridContext.CollapseDetails(dataGridContext.ParentItem);
                dataGridContext.ParentDataGridContext.ExpandDetails(dataGridContext.ParentItem);
            }
        }
    internal ColumnSynchronizationManager( DetailConfiguration configuration )
    {
      if( configuration == null )
        throw new ArgumentNullException( "configuration" );

      m_detailConfiguration = configuration;
      m_itemPropertyMap = configuration.ItemPropertyMap;

      PropertyChangedEventManager.AddListener( configuration, this, ColumnSynchronizationManager.DetailConfigurationDataGridControlPropertyName );
      PropertyChangedEventManager.AddListener( configuration, this, ColumnSynchronizationManager.DetailConfigurationIsAttachedToDetailDescriptionPropertyName );
      CollectionChangedEventManager.AddListener( ( INotifyCollectionChanged )m_itemPropertyMap, this );

      using( this.DeferSynchronization() )
      {
        this.DataGridControl = configuration.DataGridControl;
        this.DetailColumns = configuration.Columns;

        Debug.Assert( this.DetailColumns != null );
      }
    }
      internal SynchronizationKey(
        ColumnBase masterColumn,
        ColumnBase detailColumn,
        DetailConfiguration detailConfig )
      {
        if( detailColumn == null )
          throw new ArgumentNullException( "detailColumn" );

        if( detailConfig == null )
          throw new ArgumentNullException( "detailConfig" );

        m_masterColumn = masterColumn;
        m_detailColumn = detailColumn;
        m_detailConfiguration = detailConfig;
      }
    internal static void SynchronizeDetailConfigurations(
      DataGridDetailDescriptionCollection dataGridDetailDescriptionCollection,
      DetailConfigurationCollection detailConfigurationCollection,
      bool autoCreateDetailConfigurations,
      bool autoCreateForeignKeyConfigurations,
      bool autoRemoveUnassociated )
    {
      HashSet<DetailConfiguration> detailConfigWithAssociation = new HashSet<DetailConfiguration>();
      DetailConfiguration detailConfig;

      foreach( DataGridDetailDescription detailDescription in dataGridDetailDescriptionCollection )
      {
        detailConfig = detailConfigurationCollection[ detailDescription.RelationName ];

        if( detailConfig == null )
        {
          if( autoCreateDetailConfigurations )
          {
            detailConfig = new DetailConfiguration();

            detailConfig.SetIsAutoCreated( true );
            detailConfig.RelationName = detailDescription.RelationName;
            detailConfig.AutoCreateForeignKeyConfigurations = autoCreateForeignKeyConfigurations;
            detailConfig.AutoRemoveColumnsAndDetailConfigurations = autoRemoveUnassociated;
            detailConfigurationCollection.Add( detailConfig );
          }
        }

        if( detailConfig != null )
        {
          detailConfigWithAssociation.Add( detailConfig );
          detailConfig.SynchronizeWithDetailDescription( detailDescription );
        }
      }

      for( int i = detailConfigurationCollection.Count - 1; i >= 0; i-- )
      {
        detailConfig = detailConfigurationCollection[ i ];

        if( !detailConfigWithAssociation.Contains( detailConfig ) )
        {
          detailConfig.DetachFromDetailDescription();

          if( ( autoRemoveUnassociated ) && ( detailConfig.IsAutoCreated ) )
          {
            DetailConfiguration.CleanupDetailConfigurations( detailConfig.DetailConfigurations, autoRemoveUnassociated );
            detailConfigurationCollection.RemoveAt( i );
          }
        }
      }
    }
Esempio n. 5
0
 internal DataGridContext GetChildContext( object parentItem, DetailConfiguration detailConfiguration )
 {
   return this.DataGridContext.GetChildContext( parentItem, detailConfiguration );
 }
    private static DataGridContext GetDataGridContextFromDetailConfiguration(
    DetailConfiguration configuration,
    DataGridContext parentDataGridContext )
    {
      if( ( configuration == null ) || ( parentDataGridContext == null ) )
        return null;

      if( parentDataGridContext.SourceDetailConfiguration == configuration )
        return parentDataGridContext;

      foreach( DataGridContext childContext in parentDataGridContext.GetChildContexts() )
      {
        DataGridContext foundContext =
          HierarchicalGroupByControlNode.GetDataGridContextFromDetailConfiguration( configuration,
            childContext );

        if( foundContext != null )
          return foundContext;
      }

      return null;
    }
      internal DetailConfigurationAddGroupCommand( DetailConfiguration detailConfiguration )
      {
        DetailConfigurationAddGroupCommand.ThrowIfNull( detailConfiguration, "detailConfiguration" );

        m_detailConfiguration = new WeakReference( detailConfiguration );
      }
 public static void RemoveListener( DetailConfiguration source, IWeakEventListener listener )
 {
   CurrentManager.ProtectedRemoveListener( source, listener );
 }
      private void SynchronizeDetailSortDescriptions( SynchronizationContext synchronizationContext, DetailConfiguration detailConfiguration )
      {
        ColumnSortCommand.ThrowIfNull( synchronizationContext, "synchronizationContext" );
        ColumnSortCommand.ThrowIfNull( detailConfiguration, "detailConfiguration" );
        DetailConfigurationUpdateColumnSortCommand.ThrowIfDetailsNotFlatten( detailConfiguration );

        if( !synchronizationContext.Own )
          return;

        if( !detailConfiguration.IsAttachedToDetailDescription )
          return;

        var dataGridControl = detailConfiguration.DataGridControl;
        if( dataGridControl == null )
          return;

        var rootDataGridContext = dataGridControl.DataGridContext;
        var masterSortDescriptions = rootDataGridContext.Items.SortDescriptions;
        var detailSortDescriptions = detailConfiguration.SortDescriptions;

        // There is nothing to synchronize.
        if( ( masterSortDescriptions.Count == 0 ) && ( detailSortDescriptions.Count == 0 ) )
          return;

        using( this.DeferResortHelper( detailConfiguration ) )
        {
          this.SynchronizeDetailSortDescriptions( masterSortDescriptions, detailSortDescriptions, detailConfiguration.ItemPropertyMap );
        }
      }
      private IDisposable DeferResortHelper( DetailConfiguration detailConfiguration )
      {
        ColumnSortCommand.ThrowIfNull( detailConfiguration, "detailConfiguration" );

        IDisposable defer;
        if( this.TryDeferResort( detailConfiguration, out defer ) )
          return defer;

        var disposer = new Disposer();

        foreach( var dataGridContext in DetailConfigurationUpdateColumnSortCommand.GetDataGridContexts( detailConfiguration ) )
        {
          disposer.Add( this.DeferResortHelper( dataGridContext.ItemsSourceCollection, dataGridContext.Items ), DisposableType.DeferResort );
        }

        return disposer;
      }
      private static IEnumerable<DataGridContext> GetDataGridContexts( DetailConfiguration detailConfiguration )
      {
        Debug.Assert( detailConfiguration != null );

        var dataGridControl = detailConfiguration.DataGridControl;
        Debug.Assert( dataGridControl != null );

        var queue = new Queue<DataGridContext>();
        queue.Enqueue( dataGridControl.DataGridContext );

        while( queue.Count > 0 )
        {
          DataGridContext dataGridContext = queue.Dequeue();

          if( dataGridContext.SourceDetailConfiguration == detailConfiguration )
          {
            yield return dataGridContext;
          }
          else
          {
            foreach( var childContext in dataGridContext.GetChildContexts() )
            {
              queue.Enqueue( childContext );
            }
          }
        }
      }
      internal DetailConfigurationUpdateColumnSortCommand( DetailConfiguration detailConfiguration )
      {
        DetailConfigurationUpdateColumnSortCommand.ThrowIfNull( detailConfiguration, "detailConfiguration" );

        m_detailConfiguration = new WeakReference( detailConfiguration );
      }
      private static void ThrowIfDetailsNotFlatten( DetailConfiguration detailConfiguration )
      {
        Debug.Assert( detailConfiguration != null );

        var dataGridControl = detailConfiguration.DataGridControl;
        if( ( dataGridControl != null ) && ( !dataGridControl.AreDetailsFlatten ) )
          throw new InvalidOperationException( "This method cannot be invoked when details are not flattened." );
      }