/// <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 ); } } } }
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." ); }