public CompositeDataSource(DataSourcePartCollection parts)
        {
            if (parts == null)
            {
                throw new ArgumentNullException("parts");
            }

            this.parts = parts;
            TrySubscribeOnCollectionChanged(parts);
        }
        public CompositeEnumerator(DataSourcePartCollection parts)
        {
            this.parts  = parts;
            enumerators = new IEnumerator[parts.Count];
            int index = 0;

            foreach (var part in parts)
            {
                enumerators[index] = part.Collection.GetEnumerator();
                index++;
            }
        }
        public static PropertyDescriptorCollection CreatePropertyDescriptors(DataSourcePartCollection parts, IEnumerator[] enumerators)
        {
            PropertyDescriptor[] descriptors = new PropertyDescriptor[parts.Count];

            int index = 0;

            foreach (var part in parts)
            {
                IEnumerator enumerator = enumerators[index];

                CompositeDataSourcePropertyDescriptor descriptor =
                    new CompositeDataSourcePropertyDescriptor(part.PropertyName, enumerator, part.PropertyType);

                descriptors[index] = descriptor;
                index++;
            }

            // todo is there true?
            PropertyDescriptorCollection result = new PropertyDescriptorCollection(descriptors, true);

            return(result);
        }
        public static PropertyDescriptorCollection CreatePropertyDescriptors(DataSourcePartCollection parts)
        {
            IEnumerator[] enumerators = new IEnumerator[parts.Count];

            return(CreatePropertyDescriptors(parts, enumerators));
        }
 public CompositeEnumerable(DataSourcePartCollection parts)
 {
     this.parts = parts;
 }