void Initialize(IFactory <I> itemFactory)
 {
     Validate.ArgumentNotNull(parameter: itemFactory, parameterName: nameof(itemFactory));
     ItemFactory           = itemFactory;
     MultipleViewProvider  = new MultipleViewImplementation(uiObject: this);
     ItemContainerProvider = new ItemContainerImplementation(uiObject: this);
     SelectionProvider     = new SelectionImplementation <I>(uiObject: this, itemFactory: itemFactory);
     TableProvider         = new TableImplementation <I>(uiObject: this, itemFactory: itemFactory);
 }
        public override IEnumerator <AutomationElement> GetEnumerator()
        {
            var      childrenNavigator = this;
            var      icPattern         = new ItemContainerImplementation(uiObject: new UIObject(element: childrenNavigator._root));
            UIObject current           = null;
            var      flag = false;

            if (childrenNavigator.Filter.UICondition.Condition == Condition.TrueCondition)
            {
                for (current = icPattern.FindItemByProperty(uiObject: current, uiProperty: UIProperty.Get(property: AutomationElement.SearchVirtualItemsProperty), value: null); current != (UIObject)null; current = icPattern.FindItemByProperty(uiObject: current, uiProperty: UIProperty.Get(property: AutomationElement.SearchVirtualItemsProperty), value: null))
                {
                    if (childrenNavigator._autoRealize)
                    {
                        Realize(uiObject: current);
                    }
                    yield return(current.AutomationElement);
                }
            }
            else
            {
                var propertyCondition = childrenNavigator.GetPropertyConditionFromFilter();
                if (propertyCondition == null)
                {
                    for (current = icPattern.FindItemByProperty(uiObject: current, uiProperty: UIProperty.Get(property: AutomationElement.SearchVirtualItemsProperty), value: null); current != (UIObject)null; current = icPattern.FindItemByProperty(uiObject: current, uiProperty: UIProperty.Get(property: AutomationElement.SearchVirtualItemsProperty), value: null))
                    {
                        if (childrenNavigator._autoRealize)
                        {
                            Realize(uiObject: current);
                        }
                        if (childrenNavigator.Filter.Matches(element: current.AutomationElement))
                        {
                            yield return(current.AutomationElement);
                        }
                    }
                }
                else
                {
                    var property = propertyCondition.Property;
                    try {
                        current = icPattern.FindItemByProperty(uiObject: current, uiProperty: UIProperty.Get(property: property), value: propertyCondition.Value);
                    } catch (COMException ex) {
                        if (ex.HResult == -2147467259)
                        {
                            flag = true;
                        }
                    }

                    if (flag)
                    {
                        for (current = icPattern.FindItemByProperty(uiObject: current, uiProperty: UIProperty.Get(property: AutomationElement.SearchVirtualItemsProperty), value: null); current != (UIObject)null; current = icPattern.FindItemByProperty(uiObject: current, uiProperty: UIProperty.Get(property: AutomationElement.SearchVirtualItemsProperty), value: null))
                        {
                            if (childrenNavigator._autoRealize)
                            {
                                Realize(uiObject: current);
                            }
                            if (childrenNavigator.Filter.Matches(element: current.AutomationElement))
                            {
                                yield return(current.AutomationElement);
                            }
                        }
                    }
                    else
                    {
                        current = null;
                        for (current = icPattern.FindItemByProperty(uiObject: current, uiProperty: UIProperty.Get(property: property), value: propertyCondition.Value); current != (UIObject)null; current = icPattern.FindItemByProperty(uiObject: current, uiProperty: UIProperty.Get(property: property), value: propertyCondition.Value))
                        {
                            if (childrenNavigator._autoRealize)
                            {
                                Realize(uiObject: current);
                            }
                            yield return(current.AutomationElement);
                        }
                    }

                    property = null;
                }

                propertyCondition = null;
            }
        }