private void SecurityProviderOnSecuritiesChanged(bool exclude, NotifyCollectionChangedAction action, IEnumerable <Security> securities) { if (!CheckAccess()) { _prevFilter = null; _prevType = null; _isDirty = true; return; } switch (action) { case NotifyCollectionChangedAction.Add: { if (exclude) { FilterSecurities(); } else { FilteredSecurities.AddRange(securities.Where(CheckCondition)); } break; } case NotifyCollectionChangedAction.Remove: { if (exclude) { FilterSecurities(true); } else { FilteredSecurities.RemoveRange(securities); } break; } case NotifyCollectionChangedAction.Reset: { if (exclude) { FilterSecurities(); } else { FilteredSecurities.Clear(); } break; } default: throw new ArgumentOutOfRangeException(nameof(action)); } UpdateCounter(); }
private void FilterSecurities(bool fullRefresh = false) { var filter = SecurityFilter; if (filter != null) { filter = filter.Trim(); } var secType = SelectedType; // при уточняющем фильтре выполняем поиск в найденных инструментах if (!fullRefresh && !_prevFilter.IsEmpty() && filter.StartsWith(_prevFilter, StringComparison.InvariantCultureIgnoreCase) && (_prevType == secType || _prevType == null && secType != null) && FilteredSecurities.Count < 500) { FilteredSecurities.RemoveWhere(s => !CheckCondition(s)); UpdateCounter(); return; } // LookupByCode не принимает пустой фильтр if (filter.IsEmpty()) { filter = "*"; } var securities = SecurityProvider.LookupByCode(filter); var toAdd = securities .Where(s => !_excludeSecurities.Contains(s) && (secType == null || s.Type == secType)) .ToArray(); if (!FilteredSecurities.SequenceEqual(toAdd)) { FilteredSecurities.Clear(); FilteredSecurities.AddRange(toAdd); } UpdateCounter(); }