Esempio n. 1
0
        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();
        }
Esempio n. 2
0
        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();
        }