internal void Clear(DetailConfiguration detailConfiguration)
        {
            m_containersRemoved = m_containersRemoved ?? new List <DependencyObject>();

            var key = CustomItemContainerGeneratorRecyclingPools.GetKey(detailConfiguration);

            var itemContainerPool = default(ItemContainerRecyclingPool);

            if (m_itemContainerPools.TryGetValue(key, out itemContainerPool))
            {
                m_itemContainerPools.Remove(key);

                this.ClearPool(itemContainerPool, m_containersRemoved, pool => pool.Clear());
            }

            var headerFooterItemContainerPool = default(HeaderFooterItemContainerRecyclingPool);

            if (m_headerFooterItemContainerPools.TryGetValue(key, out headerFooterItemContainerPool))
            {
                m_headerFooterItemContainerPools.Remove(key);

                this.ClearPool(headerFooterItemContainerPool, m_containersRemoved, pool => pool.Clear());
            }

            var groupHeaderFooterItemContainerPool = default(GroupHeaderFooterItemContainerRecyclingPool);

            if (m_groupHeaderFooterItemContainerPools.TryGetValue(key, out groupHeaderFooterItemContainerPool))
            {
                m_groupHeaderFooterItemContainerPools.Remove(key);

                this.ClearPool(groupHeaderFooterItemContainerPool, m_containersRemoved, pool => pool.Clear());
            }

            this.OnContainersRemoved();
        }
        private T GetPool <T>(Dictionary <object, T> pools, DetailConfiguration detailConfiguration, bool create) where T : class, new()
        {
            if (pools == null)
            {
                throw new ArgumentNullException("pools");
            }

            var key  = CustomItemContainerGeneratorRecyclingPools.GetKey(detailConfiguration);
            var pool = default(T);

            if (!pools.TryGetValue(key, out pool))
            {
                if (create)
                {
                    pool = new T();
                    pools.Add(key, pool);
                }
                else
                {
                    pool = null;
                }
            }

            return(pool);
        }
            internal DeferContainersRemovedState(CustomItemContainerGeneratorRecyclingPools target)
            {
                if (target == null)
                {
                    throw new ArgumentNullException("target");
                }

                m_target = target;
            }