/// <summary> /// Ждем подгрузки дерева, инициализируем /// </summary> public void LoadTreeAndInit(FreeHierarchyTypeTreeItem freeHierarchyTypeTreeItem, bool isFullReload = false, HashSet <int> singreRootFreeHierItemIds = null) { #region Очищаем старое дерево var items = Items; Items = null; string previousSets = null; if (descriptor != null) { if (descriptor.FreeHierarchyTree != null) { //Запоминаем выбранные на прошлом дереве объекты previousSets = descriptor.FreeHierarchyTree.GetSelectedToSet(); } descriptor.Dispose(); descriptor = null; } if (items != null) { items.DisposeChildren(); items = null; } selectedType.DataContext = null; #endregion if (freeHierarchyTypeTreeItem != null) { Tree_ID = freeHierarchyTypeTreeItem.FreeHierTree_ID; } else { Tree_ID = DefaultTree_ID; } if (previousSets != null) { if (_startSelector != null) { try { _startSelector.Dispose(); _startSelector = null; } catch { } } //Была смена дерева, пытаемся выделить объекты с предыдущего дерева SetItemsForSelection(previousSets, 2); } MainLayout.RunAsync(() => new TreeStartLoader(this, freeHierarchyTypeTreeItem, _selectedNodes, isFullReload, singreRootFreeHierItemIds), loader => { //Ошибка загрузки дерева lock (_selectedNodesSyncLock) { if (loader == null || loader.Descriptor == null) { return; } } if (IsSelectSingle) { butNone.Visibility = showOnlySelected.Visibility = butAll.Visibility = System.Windows.Visibility.Collapsed; } var isFirstUsed = loader.IsFirstLoaded; IDictionary <int, FreeHierarchyTreeItem> source; lock (_selectedNodesSyncLock) { source = loader.FreeHierarchyTreeItems; descriptor = loader.Descriptor; freeHierarchyTypeTreeItem = loader.FreeHierarchyTypeTreeItem; //_loader = null; var prevTypeTreeItem = selectedType.DataContext as FreeHierarchyTypeTreeItem; if (prevTypeTreeItem != null) { selectedType.DataContext = null; prevTypeTreeItem.Dispose(); } descriptor.SelectedChanged += DescOnSelectedChanged; loader.Dispose(); } if (source == null) { return; } selectedType.DataContext = freeHierarchyTypeTreeItem; IEnumerable <KeyValuePair <int, FreeHierarchyTreeItem> > query; query = source.Where(i => i.Value != null && i.Value.Parent == null); //else //{ // //Нужно отобразить с дерево с определенного узла // query = source.Where(i => i.Value != null && singreRootFreeHierItemIds.Contains(i.Value.FreeHierItem_ID)); //} var parents = new RangeObservableCollection <FreeHierarchyTreeItem>(query .Select(i => i.Value).OrderBy(o => o, new FreeHierarchyTreeItemComparer()), new FreeHierarchyTreeItemComparer()); if (IsNSIDocuments) { parents.Add(new FreeHierarchyTreeItem(descriptor, null as FreeHierarchyTreeItem) { FreeHierItemType = EnumFreeHierarchyItemType.CommonDocuments, StringName = "Общие документы" }); } var module = FindModule(this); if (module != null && Manager.Config.TreeDefaults != null) { Manager.Config.TreeDefaults[module.ModuleType + Name] = descriptor.Tree_ID.GetValueOrDefault(); } //Пытаемся оставить совместимость if (module != null && Manager.Config.FreeSets != null) { var setKey = module.ModuleType + ":" + freeHierarchyTypeTreeItem.FreeHierTree_ID; Dictionary <string, List <string> > set; if (Manager.Config.FreeSets.TryGetValue(setKey, out set) && set != null) { Dictionary <string, List <string> > ks; if (Manager.Config.FreeSets.TryGetValue( freeHierarchyTypeTreeItem.FreeHierTree_ID.ToString(), out ks) && ks != null) { foreach (var k in ks) { List <string> existsSet; if (set.TryGetValue(k.Key, out existsSet) && existsSet != null) { existsSet.AddRange(k.Value); } else { set[k.Key] = k.Value; } } } Manager.Config.FreeSets[freeHierarchyTypeTreeItem.FreeHierTree_ID.ToString()] = set; Manager.Config.FreeSets.Remove(setKey); } } sets.InitGlobal(freeHierarchyTypeTreeItem.FreeHierTree_ID.ToString()); Items = parents; if (OnTreeDataLoaded != null) { OnTreeDataLoaded(this, new EventArgsTreeItems { Items = parents, }); } }, priority: DispatcherPriority.Normal); }