示例#1
0
        /// <summary>
        /// Обновляет выходную коллекцию, стараясь изменить ее по минимуму, чтобы не перестраивать визуальное представление списка авторов
        /// </summary>
        public static void Refresh()
        {
            if (_isListUpdates)
            {
                return;
            }
            try
            {
                #region Создаем преставление данных из списка Authors, фильруем, сортируем

                ListCollectionView authorCollectionView = new ListCollectionView(Authors.Where(a => !a.IsDeleted).ToList());
                authorCollectionView.Filter += CheckIncludeAuthorInCollection;
                switch (_sortProperty)
                {
                case "UpdateDate":
                    authorCollectionView.SortDescriptions.Add(new SortDescription("Group", ListSortDirection.Ascending));
                    authorCollectionView.SortDescriptions.Add(new SortDescription(_sortProperty, _sortDirection));
                    break;

                case "Name":
                    authorCollectionView.SortDescriptions.Add(new SortDescription(_sortProperty, _sortDirection));
                    break;
                }

                #endregion

                #region Создаем из представления промежуточный список, который учитывает наличие категорий и их раскрытость

                List <object> tempList = new List <object>();
                if (UseCategory)
                {
                    string[] categoryFromAuthors = Authors.GetCategoryNames();
                    // подергиваем все категории из Authors, чтоб они создались в Categories, если их еще не было
                    foreach (string categoryName in categoryFromAuthors)
                    {
                        Categories.GetCategoryFromName(categoryName);
                    }
                    // заполняем промежуточный список
                    foreach (Category category in Categories)
                    {
                        category.SetVisualNameAndIsNew(authorCollectionView);
                        tempList.Add(category);
                        if (category.Collapsed)
                        {
                            continue;
                        }
                        foreach (Author author in authorCollectionView)
                        {
                            if (author.Category == category.Name)//&& !author.IsDeleted - сюда больше не попадают удаленные авторы, см. создание authorCollectionView в начале функции
                            {
                                tempList.Add(author);
                            }
                        }
                    }
                }
                else
                {
                    foreach (var collectionItem in authorCollectionView)
                    {
                        tempList.Add(collectionItem);
                    }
                }

                authorCollectionView.Filter -= CheckIncludeAuthorInCollection;

                #endregion

                #region Заполняем выходную коллекцию, стараясь по максимуму использовать имеющиеся элементы

                // Просматриваем выходную коллекцию, удаляя элементы, отсутствующие во временном списке
                for (int i = OutputCollection.Count - 1; i >= 0; i--)
                {
                    if (!tempList.Contains(OutputCollection[i]))
                    {
                        OutputCollection.RemoveAt(i);
                    }
                }
                // Просматриваем временную коллекцию, добавляя из нее в выходную те элементы,
                // которые отсутствуют в выходной коллекции. Одновременно выходная сортируется по временной
                for (int i = 0; i < tempList.Count; i++)
                {
                    object currentItem = tempList[i];
                    int    outPos      = OutputCollection.IndexOf(currentItem);
                    if (outPos == i)
                    {
                        continue;
                    }
                    if (outPos >= 0)
                    {
                        OutputCollection.Move(outPos, i);
                    }
                    else
                    {
                        OutputCollection.Insert(i, currentItem);
                    }
                }

                #endregion

                OnInfoUpdaterRefresh();
            }
            catch
            {}
        }