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)); }
public Product GetProduct(Product originProduct = null) { var bank = GetBank(originProduct); //предварительно выбранный продукт var selectedProduct = originProduct == null ? null : bank.Products.Single(x => x.Id == originProduct.Id); var productSelector = new ProductSelector(bank, bank.Parameters, selectedProduct); var owner = Application.Current.Windows.OfType <Window>().SingleOrDefault(x => x.IsActive); var window = new SelectProductWindow { DataContext = productSelector, Owner = owner }; window.ShowDialog(); //если необходимо создать новый продукт if (window.ShoodCreateNew) { var productNew = Container.Resolve <INewProductService>().GetNewProduct(); return(productNew ?? originProduct); } //если необходимо выбрать комплект if (window.ShoodSelectComplect) { var complectViewModel = Container.Resolve <ComplectsViewModel>(); complectViewModel.ShowDialog(); return(complectViewModel.IsSelected ? complectViewModel.SelectedItem.Product : originProduct); } //выходим, если пользователь отменил выбор продукта. if (!window.DialogResult.HasValue || !window.DialogResult.Value) { return(originProduct); } var result = productSelector.SelectedProduct; //оставляем только уникальные блоки //var blocks = result.GetBlocks().Distinct().ToList(); //SubstitutionBlocks(result, blocks); //загрузка актуальных продуктов var products = UnitOfWork.Repository <Product>().GetAll(); //если выбранного продукта нет в базе if (products.Contains(result) == false) { SubstitutionProducts(result, products); if (UnitOfWork.SaveEntity(result).OperationCompletedSuccessfully) { Container.Resolve <IEventAggregator>().GetEvent <AfterSaveProductEvent>().Publish(result); } else { throw new Exception("Ошибка при сохранении нового продукта в базу данных."); } } return(result); }