Esempio n. 1
0
        public ProductSelector(Bank bank, IEnumerable <Parameter> parameters, Product selectedProduct = null, int amount = 1)
        {
            if (parameters == null)
            {
                throw new ArgumentNullException(nameof(parameters));
            }

            Bank   = bank;
            Amount = amount;

            //создаем селектор блока
            BlockSelector = new ProductBlockSelector(parameters, Bank, selectedProduct?.ProductBlock);
            //подписываемся на событие его изменения
            BlockSelector.SelectedBlockChanged += selector =>
            {
                RefreshProductSelectors();
                SelectedProductChanged?.Invoke();
                OnPropertyChanged(nameof(SelectedProduct));
            };

            //удаление/добавление селекторов дочерних продуктов
            ProductSelectors.CollectionChanged += (sender, args) =>
            {
                args.NewItems?.Cast <ProductSelector>().ForEach(x => x.SelectedProductChanged += OnChildProductChanged);
                args.OldItems?.Cast <ProductSelector>().ForEach(x => x.SelectedProductChanged -= OnChildProductChanged);
            };

            if (selectedProduct == null)
            {
                //поиск селектора, содержащего базовые параметры
                var parameterSelector = BlockSelector.ParameterSelectors.Single(x => x.ParametersFlaged.All(p => p.Parameter.IsOrigin));
                //выбор параметра
                parameterSelector.SelectedParameterFlaged = parameterSelector.ParametersFlaged.First();
            }
            else
            {
                foreach (var kvp in GetDictionaryOfMatching(selectedProduct))
                {
                    if (Equals(kvp.Value, default(IEnumerable <Product>)))
                    {
                        continue;
                    }

                    foreach (var product in kvp.Value)
                    {
                        //редактируем список параметров
                        var usefullParameters = bank.Parameters.GetUsefull(kvp.Key);
                        var productSelector   = new ProductSelector(bank, usefullParameters, product);
                        ProductSelectors.Add(productSelector);
                    }
                }
            }
        }
Esempio n. 2
0
        private void RefreshProductSelectors()
        {
            //упорядочиваем селектры продуктов по уменьшению количества параметров в блоке
            var productSelectors = ProductSelectors.OrderByDescending(x => x.SelectedProduct.ProductBlock.Parameters.Count).ToList();

            //загружаем связи к дочерним продуктам, упорядоченные по количеству параметров, зависимого продукта
            var childProductsRelations = Bank.RelationsToChildProducts(SelectedProduct).OrderBy(x => x.ChildProductParameters.Count).ToList();

            var relaitionsDictionary = new Dictionary <ProductRelation, int>();

            foreach (var actualProductRelation in childProductsRelations)
            {
                relaitionsDictionary.Add(actualProductRelation, actualProductRelation.ChildProductsAmount);
            }

            //удаление неактуальных селекторов и чистка связей
            foreach (var productSelector in productSelectors.ToList())
            {
                //ищем связь, которая соответствует селектору
                var relation = childProductsRelations.FirstOrDefault(x => x.ChildProductParameters.AllContainsIn(productSelector.BlockSelector.SelectedBlock.Parameters));

                //если не находим - сносим ее
                if (relation == null)
                {
                    ProductSelectors.Remove(productSelector);
                }
                //если находим - корректируем связь и удаляем этот селектор из поиска
                else
                {
                    productSelectors.Remove(productSelector);

                    relaitionsDictionary[relation] -= productSelector.Amount;
                    if (relaitionsDictionary[relation] == 0)
                    {
                        childProductsRelations.Remove(relation);
                    }
                }
            }

            //добавление новых актуальных селекторов
            foreach (var productRelation in childProductsRelations)
            {
                for (int i = 0; i < relaitionsDictionary[productRelation]; i++)
                {
                    //новый селектор с усеченными под связь параметрами
                    var productSelector = new ProductSelector(Bank, Bank.Parameters.GetUsefull(productRelation));
                    ProductSelectors.Add(productSelector);
                }
            }

            OnPropertyChanged(nameof(HasDependentProducts));
        }