/// <summary>
        /// Add a validation item context to a proper group
        /// </summary>
        /// <param name="itemContext"></param>
        private ValidationGroupContext AddToGroup(ValidationItemContextBase itemContext)
        {
            IValidationItem item = itemContext.ValidationItem;

            string groupName = null;

            //if (this.DisplayConfig.IsByDeviceType)
            groupName = item.DeviceType;
            //else
            //    groupName = item.Category;

            ValidationGroupContext group;

            if (!groupNameToContext.TryGetValue(groupName, out group))
            {
                group = new ValidationGroupContext(groupName);
                groupNameToContext.Add(groupName, group);

                group.IsExpandedChanged += new EventHandler(group_IsExpandedChanged);

                this.ValidationGroups.Add(group);
            }

            if (group.ValidationResultItems.Contains(itemContext) == false)
            {
                group.ValidationResultItems.Add(itemContext);
            }

            if (this.validationItem2ItemGroupViewModel.ContainsKey(item) == false)
            {
                this.validationItem2ItemGroupViewModel.Add(item, group);
            }

            return(group);
        }
        private void RemoveGroup(ValidationGroupContext groupCxt)
        {
            this.ValidationGroups.Remove(groupCxt);
            this.groupNameToContext.Remove(groupCxt.SortingName);

            groupCxt.IsExpandedChanged -= new EventHandler(group_IsExpandedChanged);

            this.BindingList.Remove(groupCxt);
        }
        //private void ReportButton_Click(object sender, System.Windows.RoutedEventArgs e)
        //{
        //    DesignValidationContext cxt = this.DataContext as DesignValidationContext;
        //    if (cxt == null)
        //    {
        //        Debug.Assert(false);
        //        return;
        //    }
        //    AudDocument audDoc = AudApplication.DocumentManager.Active;
        //    ValidationItemReport report = new ValidationItemReport(audDoc);
        //    foreach (ValidationGroupContext grp in cxt.ValidationGroups)
        //        report.AddValidationItems(
        //            from ValidationItemContextBase vicb in grp.ValidationResultItems
        //            select vicb.ValidationItem, true);
        //    report.Report(Properties.Resources.DesignValidation);
        //}


        //private void ResolveButton_Click(object sender, System.Windows.RoutedEventArgs e)
        //{
        //    DesignValidationContext cxt = this.DataContext as DesignValidationContext;
        //    if (cxt != null)
        //        cxt.ResolveAll();
        //}


        private void validationGroupsControl_CleanUpVirtualizedItem(object sender, CleanUpVirtualizedItemEventArgs e)
        {
            if (e == null)
            {
                return;
            }

            ValidationGroupContext group = e.Value as ValidationGroupContext;

            if (group == null)
            {
                return;
            }

            group.DisconnectByVirtualizationCleanup();
        }
        /// <summary>
        /// User clicked to collapse or expand a group;
        /// To improve performance by XXX times we simply bind a list to Validation Result listbox,
        ///   so here we manually remove/add validation items from/to the group
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void group_IsExpandedChanged(object sender, EventArgs e)
        {
            ValidationGroupContext group = sender as ValidationGroupContext;

            if (group == null)
            {
                return;
            }

            if (group.IsExpanded)
            {
                int index = this.BindingList.IndexOf(group) + 1;
                if (index < 1)
                {
                    Debug.Assert(false);
                    return;
                }

                foreach (var item in group.ValidationResultItems)
                {
                    if (item.IsVisible)
                    {
                        this.BindingList.Insert(index++, item);
                    }
                }
            }
            else
            {
                foreach (var item in group.ValidationResultItems)
                {
                    if (item.IsVisible)//otherwise it's not in binding list
                    {
                        this.BindingList.Remove(item);
                    }
                }
            }
        }
        /// <summary>
        /// Validation item set changed
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void validationItems_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            Dictionary <string, ValidationGroupContext> affectedGroups = new Dictionary <string, ValidationGroupContext>();

            if (e.NewItems != null)
            {
                foreach (var obj in e.NewItems)
                {
                    IValidationItem item = obj as IValidationItem;
                    if (item == null)
                    {
                        continue;
                    }

                    ValidationGroupContext    group   = this.CreateValidationItemContext(item);
                    ValidationItemContextBase itemCxt = this.validationItem2ItemViewModel[item];
                    Debug.Assert(itemCxt != null);

                    int indexToInsert = -1;
                    if (!this.BindingList.Contains(group))
                    {
                        this.BindingList.Add(group);
                        if (group.IsExpanded)
                        {
                            indexToInsert = this.BindingList.IndexOf(group) + 1;
                        }
                    }
                    else
                    {
                        if (group.IsExpanded && itemCxt.IsVisible)
                        {
                            //note that when calling group.GetVisibleChildrenCount, itemCxt is already counted
                            indexToInsert = this.BindingList.IndexOf(group) + group.GetVisibleChildrenCount();
                        }
                    }

                    if ((indexToInsert >= 0) && itemCxt.IsVisible)
                    {
                        this.BindingList.Insert(indexToInsert, itemCxt);
                    }

                    if (affectedGroups.ContainsKey(group.SortingName) == false)
                    {
                        affectedGroups.Add(group.SortingName, group);
                    }
                }
            }

            bool toClearClickedItem = false;

            if (e.OldItems != null)
            {
                foreach (var obj in e.OldItems)
                {
                    IValidationItem item = obj as IValidationItem;
                    if (item == null)
                    {
                        continue;
                    }

                    //if ((this.clickedItem != null) &&
                    //    Object.ReferenceEquals(this.clickedItem.ValidationItem, item))
                    //{
                    //    toClearClickedItem = true;
                    //}

                    ValidationGroupContext group = this.validationItem2ItemGroupViewModel[item];
                    if (group == null)
                    {
                        continue;
                    }

                    ValidationItemContextBase itemCxt = this.validationItem2ItemViewModel[item];
                    if (itemCxt == null)
                    {
                        continue;
                    }

                    group.ValidationResultItems.Remove(itemCxt);
                    this.validationItem2ItemViewModel.Remove(item);
                    this.validationItem2ItemGroupViewModel.Remove(item);
                    if (this.BindingList.Contains(itemCxt))
                    {
                        this.BindingList.Remove(itemCxt);
                    }

                    if (affectedGroups.ContainsKey(group.SortingName) == false)
                    {
                        affectedGroups.Add(group.SortingName, group);
                    }
                }
            }

            foreach (var group in affectedGroups)
            {
                if (group.Value.ValidationResultItems.Count == 0)
                {
                    ValidationGroupContext groupCxt = group.Value;
                    this.RemoveGroup(groupCxt);
                }
                else
                {
                    group.Value.UpdateHeader();
                }
            }

            ValidationManager validationManager = this.ValidationManager;

            if (validationManager == null)
            {
                return;
            }

            //this.UpdateDisplayConfigSettings(validationManager.ValidationItemCount);

            //if (toClearClickedItem && (this.clickedItem != null))
            //    this.OnItemClicked(null);

            base.OnPropertyChanged("HasResolveItems");
        }