private async Task <IObjectEditor[]> AddEditorsAsync(IList newItems)
        {
            Task <IObjectEditor>[] newEditorTasks = new Task <IObjectEditor> [newItems.Count];
            for (int i = 0; i < newEditorTasks.Length; i++)
            {
                newEditorTasks[i] = EditorProvider.GetObjectEditorAsync(newItems[i]);
            }

            IObjectEditor[] newEditors = await Task.WhenAll(newEditorTasks);

            for (int i = 0; i < newEditors.Length; i++)
            {
                IObjectEditor editor = newEditors[i];
                if (editor == null)
                {
                    continue;
                }

                var notifier = editor.Properties as INotifyCollectionChanged;
                if (notifier != null)
                {
                    notifier.CollectionChanged += OnObjectEditorPropertiesChanged;
                }
            }

            this.objEditors.AddRange(newEditors);
            return(newEditors);
        }
        private async Task <IReadOnlyList <ObjectTreeElement> > QueryChildrenAsync(IEditorProvider provider)
        {
            var targets = await provider.GetChildrenAsync(Editor.Target);

            List <Task <IObjectEditor> > editorTasks = new List <Task <IObjectEditor> > ();

            foreach (object target in targets)
            {
                editorTasks.Add(provider.GetObjectEditorAsync(target));
            }

            IObjectEditor[] editors = await Task.WhenAll(editorTasks);

            return(editors.Select(e => new ObjectTreeElement(provider, e)).ToArray());
        }