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); } } } }
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)); }