コード例 #1
0
 private void CreateAddWriteoffItemCommand()
 {
     AddWriteoffItemCommand = new DelegateCommand(
         () => {
         var fuelTypeJournalViewModel = new SimpleEntityJournalViewModel <FuelType, FuelTypeViewModel>(x => x.Name,
                                                                                                       () => new FuelTypeViewModel(EntityUoWBuilder.ForCreate(), unitOfWorkFactory, commonServices),
                                                                                                       (node) => new FuelTypeViewModel(EntityUoWBuilder.ForOpen(node.Id), unitOfWorkFactory, commonServices),
                                                                                                       QS.DomainModel.UoW.UnitOfWorkFactory.GetDefaultFactory,
                                                                                                       commonServices
                                                                                                       );
         fuelTypeJournalViewModel.SetRestriction(() => {
             return(Restrictions.Not(Restrictions.In(Projections.Id(), Entity.ObservableFuelWriteoffDocumentItems.Select(x => x.FuelType.Id).ToArray())));
         });
         fuelTypeJournalViewModel.SelectionMode           = JournalSelectionMode.Single;
         fuelTypeJournalViewModel.OnEntitySelectedResult += (sender, e) => {
             var node = e.SelectedNodes.FirstOrDefault();
             if (node == null)
             {
                 return;
             }
             Entity.AddNewWriteoffItem(UoW.GetById <FuelType>(node.Id));
         };
         TabParent.AddSlaveTab(this, fuelTypeJournalViewModel);
     },
         () => CanEdit
         );
     AddWriteoffItemCommand.CanExecuteChangedWith(this, x => CanEdit);
 }
コード例 #2
0
        public IEntityAutocompleteSelectorFactory CreateSimpleExpenseCategoryAutocompleteSelectorFactory()
        {
            var expenceCategoryfilterViewModel = new ExpenseCategoryJournalFilterViewModel();

            expenceCategoryfilterViewModel.ExcludedIds    = _excludedIds;
            expenceCategoryfilterViewModel.HidenByDefault = true;

            var employeeFilter = new EmployeeFilterViewModel
            {
                Status = EmployeeStatus.IsWorking
            };

            var employeeJournalFactory    = new EmployeeJournalFactory(employeeFilter);
            var subdivisionJournalFactory = new SubdivisionJournalFactory();
            var expenseFactory            = new ExpenseCategorySelectorFactory();

            return(new SimpleEntitySelectorFactory <ExpenseCategory, ExpenseCategoryViewModel>(() =>
            {
                var journal = new SimpleEntityJournalViewModel <ExpenseCategory, ExpenseCategoryViewModel>(
                    x => x.Name,
                    () => new ExpenseCategoryViewModel(
                        EntityUoWBuilder.ForCreate(),
                        UnitOfWorkFactory.GetDefaultFactory,
                        ServicesConfig.CommonServices,
                        employeeJournalFactory,
                        subdivisionJournalFactory,
                        expenseFactory
                        ),
                    node => new ExpenseCategoryViewModel(
                        EntityUoWBuilder.ForOpen(node.Id),
                        UnitOfWorkFactory.GetDefaultFactory,
                        ServicesConfig.CommonServices,
                        employeeJournalFactory,
                        subdivisionJournalFactory,
                        expenseFactory
                        ),
                    UnitOfWorkFactory.GetDefaultFactory,
                    ServicesConfig.CommonServices
                    );
                journal.SelectionMode = JournalSelectionMode.Single;
                journal.SetFilter(expenceCategoryfilterViewModel,
                                  filter =>
                {
                    if (filter.ShowArchive)
                    {
                        return Restrictions.Not(Restrictions.In("Id", filter.ExcludedIds.ToArray()));
                    }

                    return Restrictions.Conjunction()
                    .Add(Restrictions.Not(Restrictions.In("Id", filter.ExcludedIds.ToArray())))
                    .Add(Restrictions.Eq(
                             Projections.Property <ExpenseCategory>(c => c.IsArchive), filter.ShowArchive));
                });
                return journal;
            }));
        }
コード例 #3
0
 public IEntityAutocompleteSelectorFactory CreateDeliveryScheduleAutocompleteSelectorFactory()
 {
     return(new SimpleEntitySelectorFactory <DeliverySchedule, DeliveryScheduleDlg>(() =>
     {
         var journal = new SimpleEntityJournalViewModel <DeliverySchedule, DeliveryScheduleDlg>(
             ds => ds.Name,
             () => new DeliveryScheduleDlg(),
             (node) => new DeliveryScheduleDlg(node.Id),
             UnitOfWorkFactory.GetDefaultFactory,
             ServicesConfig.CommonServices);
         journal.SelectionMode = JournalSelectionMode.Single;
         return journal;
     }));
 }
コード例 #4
0
        private void CreateAddWriteoffItemCommand()
        {
            AddWriteoffItemCommand = new DelegateCommand(
                () => {
                var fuelTypeJournalViewModel = new SimpleEntityJournalViewModel <FuelType, FuelTypeViewModel>(x => x.Name,
                                                                                                              () => new FuelTypeViewModel(EntityUoWBuilder.ForCreate(), unitOfWorkFactory, commonServices),
                                                                                                              (node) => new FuelTypeViewModel(EntityUoWBuilder.ForOpen(node.Id), unitOfWorkFactory, commonServices),
                                                                                                              QS.DomainModel.UoW.UnitOfWorkFactory.GetDefaultFactory,
                                                                                                              commonServices
                                                                                                              );
                fuelTypeJournalViewModel.SetRestriction(() => {
                    return(Restrictions.Not(Restrictions.In(Projections.Id(), Entity.ObservableFuelWriteoffDocumentItems.Select(x => x.FuelType.Id).ToArray())));
                });
                fuelTypeJournalViewModel.SelectionMode           = JournalSelectionMode.Single;
                fuelTypeJournalViewModel.OnEntitySelectedResult += (sender, e) => {
                    var node = e.SelectedNodes.FirstOrDefault();
                    if (node == null)
                    {
                        return;
                    }
                    Entity.AddNewWriteoffItem(UoW.GetById <FuelType>(node.Id));
                };

                var fuelTypePermissionSet = commonServices.PermissionService.ValidateUserPermission(typeof(FuelType), commonServices.UserService.CurrentUserId);
                if (fuelTypePermissionSet.CanRead && !fuelTypePermissionSet.CanUpdate)
                {
                    var viewAction = new JournalAction("Просмотр",
                                                       (selected) => selected.Any(),
                                                       (selected) => true,
                                                       (selected) =>
                    {
                        var tab = fuelTypeJournalViewModel.GetTabToOpen(typeof(FuelType), selected.First().GetId());
                        fuelTypeJournalViewModel.TabParent.AddTab(tab, fuelTypeJournalViewModel);
                    }
                                                       );

                    (fuelTypeJournalViewModel.NodeActions as IList <IJournalAction>)?.Add(viewAction);
                }

                TabParent.AddSlaveTab(this, fuelTypeJournalViewModel);
            },
                () => CanEdit
                );
            AddWriteoffItemCommand.CanExecuteChangedWith(this, x => CanEdit);
        }
コード例 #5
0
 public IEntityAutocompleteSelectorFactory CreateOrganizationAutocompleteSelectorFactory()
 {
     return(new SimpleEntitySelectorFactory <Organization, OrganizationDlg>(
                () =>
     {
         var organisationJournal =
             new SimpleEntityJournalViewModel <Organization, OrganizationDlg>(
                 x => x.Name,
                 () => new OrganizationDlg(),
                 node => new OrganizationDlg(node.Id),
                 UnitOfWorkFactory.GetDefaultFactory,
                 ServicesConfig.CommonServices
                 )
         {
             SelectionMode = JournalSelectionMode.Single
         };
         return organisationJournal;
     }));
 }
コード例 #6
0
        public IEntityAutocompleteSelectorFactory CreateSimpleIncomeCategoryAutocompleteSelectorFactory()
        {
            var commonServices            = ServicesConfig.CommonServices;
            var employeeJournalFactory    = new EmployeeJournalFactory();
            var subdivisionJournalFactory = new SubdivisionJournalFactory();
            var incomeFactory             = new IncomeCategorySelectorFactory();

            var incomeCategoryAutocompleteSelectorFactory =
                new SimpleEntitySelectorFactory <IncomeCategory, IncomeCategoryViewModel>(
                    () =>
            {
                var incomeCategoryJournalViewModel =
                    new SimpleEntityJournalViewModel <IncomeCategory, IncomeCategoryViewModel>(
                        x => x.Name,
                        () => new IncomeCategoryViewModel(
                            EntityUoWBuilder.ForCreate(),
                            UnitOfWorkFactory.GetDefaultFactory,
                            commonServices,
                            employeeJournalFactory,
                            subdivisionJournalFactory,
                            incomeFactory
                            ),
                        node => new IncomeCategoryViewModel(
                            EntityUoWBuilder.ForOpen(node.Id),
                            UnitOfWorkFactory.GetDefaultFactory,
                            commonServices,
                            employeeJournalFactory,
                            subdivisionJournalFactory,
                            incomeFactory
                            ),
                        UnitOfWorkFactory.GetDefaultFactory,
                        commonServices
                        )
                {
                    SelectionMode = JournalSelectionMode.Single
                };
                return(incomeCategoryJournalViewModel);
            });

            return(incomeCategoryAutocompleteSelectorFactory);
        }
コード例 #7
0
        public CashRequestViewModel(
            IEntityUoWBuilder uowBuilder,
            IUnitOfWorkFactory unitOfWorkFactory,
            ICommonServices commonServices,
            IFileChooserProvider fileChooserProvider,
            IEmployeeRepository employeeRepository,
            CashRepository cashRepository,
            ConsoleInteractiveService consoleInteractiveService
            ) : base(uowBuilder, unitOfWorkFactory, commonServices)
        {
            this.uowBuilder                = uowBuilder ?? throw new ArgumentNullException(nameof(uowBuilder));
            this.cashRepository            = cashRepository ?? throw new ArgumentNullException(nameof(cashRepository));
            this.unitOfWorkFactory         = unitOfWorkFactory ?? throw new ArgumentNullException(nameof(unitOfWorkFactory));
            this.consoleInteractiveService = consoleInteractiveService ?? throw new ArgumentNullException(nameof(consoleInteractiveService));
            var filterViewModel = new ExpenseCategoryJournalFilterViewModel {
                ExcludedIds    = CategoryRepository.ExpenseSelfDeliveryCategories(UoW).Select(x => x.Id),
                HidenByDefault = true
            };

            ExpenseCategoryAutocompleteSelectorFactory =
                new SimpleEntitySelectorFactory <ExpenseCategory, ExpenseCategoryViewModel>(
                    () =>
            {
                var expenseCategoryJournalViewModel =
                    new SimpleEntityJournalViewModel <ExpenseCategory, ExpenseCategoryViewModel>(
                        x => x.Name,
                        () => new ExpenseCategoryViewModel(
                            EntityUoWBuilder.ForCreate(),
                            unitOfWorkFactory,
                            ServicesConfig.CommonServices,
                            fileChooserProvider,
                            filterViewModel
                            ),
                        node => new ExpenseCategoryViewModel(
                            EntityUoWBuilder.ForOpen(node.Id),
                            unitOfWorkFactory,
                            ServicesConfig.CommonServices,
                            fileChooserProvider,
                            filterViewModel
                            ),
                        unitOfWorkFactory,
                        ServicesConfig.CommonServices
                        )
                {
                    SelectionMode = JournalSelectionMode.Single
                };
                expenseCategoryJournalViewModel.SetFilter(filterViewModel,
                                                          filter => Restrictions.Not(Restrictions.In("Id", filter.ExcludedIds.ToArray())));

                return(expenseCategoryJournalViewModel);
            });

            var expenseCategorySelectorFactory =
                CurrentEmployee = employeeRepository.GetEmployeeForCurrentUser(UoW);

            if (uowBuilder.IsNewEntity)
            {
                TabName = "Создание новой заявки на выдачу ДС";
            }
            else
            {
                TabName = $"{Entity.Title}";
            }

            int userId  = ServicesConfig.CommonServices.UserService.CurrentUserId;
            var isAdmin = ServicesConfig.CommonServices.UserService.GetCurrentUser(UoW).IsAdmin;

            IsAdminPanelVisible = isAdmin;

            var currentRole = getUserRole(userId);

            UserRole = currentRole;
            if (!dialogLoadedOnce)
            {
                savedUserRole    = UserRole;
                dialogLoadedOnce = true;
            }
            if (isAdmin)
            {
                UserRole = savedUserRole;
            }
            IsNewEntity = uowBuilder.IsNewEntity;
            ConfigureEntityChangingRelations();
        }
コード例 #8
0
        void ConfigureDlg()
        {
            if (!UoW.IsNew)
            {
                enumcomboOperation.Sensitive         = false;
                specialListCmbOrganisation.Sensitive = false;
            }

            accessfilteredsubdivisionselectorwidget.OnSelected += Accessfilteredsubdivisionselectorwidget_OnSelected;
            if (Entity.RelatedToSubdivision != null)
            {
                accessfilteredsubdivisionselectorwidget.SelectIfPossible(Entity.RelatedToSubdivision);
            }

            enumcomboOperation.ItemsEnum = typeof(ExpenseType);
            enumcomboOperation.Binding.AddBinding(Entity, s => s.TypeOperation, w => w.SelectedItem).InitializeFromSource();

            var filterCasher = new EmployeeFilterViewModel {
                Status = EmployeeStatus.IsWorking
            };

            yentryCasher.RepresentationModel = new ViewModel.EmployeesVM(filterCasher);
            yentryCasher.Binding.AddBinding(Entity, s => s.Casher, w => w.Subject).InitializeFromSource();

            var filterEmployee = new EmployeeFilterViewModel {
                Status = EmployeeStatus.IsWorking
            };

            yentryEmployee.RepresentationModel = new ViewModel.EmployeesVM(filterEmployee);
            yentryEmployee.Binding.AddBinding(Entity, s => s.Employee, w => w.Subject).InitializeFromSource();
            yentryEmployee.ChangedByUser += (sender, e) => UpdateEmployeeBalaceInfo();

            ydateDocument.Binding.AddBinding(Entity, s => s.Date, w => w.Date).InitializeFromSource();
            ydateDocument.Sensitive = canEditDate;

            IFileChooserProvider fileChooserProvider = new FileChooser("Расход " + DateTime.Now + ".csv");
            var filterViewModel = new ExpenseCategoryJournalFilterViewModel {
                ExcludedIds    = CategoryRepository.ExpenseSelfDeliveryCategories(UoW).Select(x => x.Id),
                HidenByDefault = true
            };

            var expenseCategorySelectorFactory = new SimpleEntitySelectorFactory <ExpenseCategory, ExpenseCategoryViewModel>(
                () => {
                var expenseCategoryJournalViewModel = new SimpleEntityJournalViewModel <ExpenseCategory, ExpenseCategoryViewModel>(
                    x => x.Name,
                    () => new ExpenseCategoryViewModel(
                        EntityUoWBuilder.ForCreate(),
                        UnitOfWorkFactory.GetDefaultFactory,
                        ServicesConfig.CommonServices,
                        fileChooserProvider,
                        filterViewModel
                        ),
                    node => new ExpenseCategoryViewModel(
                        EntityUoWBuilder.ForOpen(node.Id),
                        UnitOfWorkFactory.GetDefaultFactory,
                        ServicesConfig.CommonServices,
                        fileChooserProvider,
                        filterViewModel
                        ),
                    UnitOfWorkFactory.GetDefaultFactory,
                    ServicesConfig.CommonServices
                    )
                {
                    SelectionMode = JournalSelectionMode.Single
                };
                expenseCategoryJournalViewModel.SetFilter(filterViewModel,
                                                          filter => Restrictions.Not(Restrictions.In("Id", filter.ExcludedIds.ToArray())));

                return(expenseCategoryJournalViewModel);
            }
                );

            entityVMEntryExpenseCategory.SetEntityAutocompleteSelectorFactory(expenseCategorySelectorFactory);
            entityVMEntryExpenseCategory.Binding.AddBinding(Entity, e => e.ExpenseCategory, w => w.Subject).InitializeFromSource();

            specialListCmbOrganisation.ShowSpecialStateNot = true;
            specialListCmbOrganisation.ItemsList           = UoW.GetAll <Organization>();
            specialListCmbOrganisation.Binding.AddBinding(Entity, e => e.Organisation, w => w.SelectedItem).InitializeFromSource();

            yspinMoney.Binding.AddBinding(Entity, s => s.Money, w => w.ValueAsDecimal).InitializeFromSource();

            ytextviewDescription.Binding.AddBinding(Entity, s => s.Description, w => w.Buffer.Text).InitializeFromSource();

            ExpenseType type = (ExpenseType)enumcomboOperation.SelectedItem;

            ylabelEmployeeWageBalance.Visible = type == ExpenseType.EmployeeAdvance ||
                                                type == ExpenseType.Salary ||
                                                (type == ExpenseType.Advance && (new EmployeeCategory[] { EmployeeCategory.office }).All(x => x != Entity?.Employee?.Category));
            UpdateEmployeeBalaceInfo();
            UpdateSubdivision();

            if (!CanEdit)
            {
                table1.Sensitive = false;
                accessfilteredsubdivisionselectorwidget.Sensitive = false;
                buttonSave.Sensitive          = false;
                ytextviewDescription.Editable = false;
            }
        }
コード例 #9
0
        private void ConfigureEntityViewModelEntry()
        {
            var incomeCategoryFilter  = new IncomeCategoryJournalFilterViewModel();
            var expenseCategoryFilter = new ExpenseCategoryJournalFilterViewModel {
                ExcludedIds    = new CategoryRepository(new ParametersProvider()).ExpenseSelfDeliveryCategories(UoW).Select(x => x.Id),
                HidenByDefault = true
            };

            var commonServices = ServicesConfig.CommonServices;
            IFileChooserProvider chooserIncomeProvider  = new FileChooser("Приход " + DateTime.Now + ".csv");
            IFileChooserProvider chooserExpenseProvider = new FileChooser("Расход " + DateTime.Now + ".csv");
            var employeeJournalFactory    = new EmployeeJournalFactory();
            var subdivisionJournalFactory = new SubdivisionJournalFactory();

            var incomeCategoryAutocompleteSelectorFactory =
                new SimpleEntitySelectorFactory <IncomeCategory, IncomeCategoryViewModel>(
                    () =>
            {
                var incomeCategoryJournalViewModel =
                    new SimpleEntityJournalViewModel <IncomeCategory, IncomeCategoryViewModel>(
                        x => x.Name,
                        () => new IncomeCategoryViewModel(
                            EntityUoWBuilder.ForCreate(),
                            UnitOfWorkFactory.GetDefaultFactory,
                            commonServices,
                            chooserIncomeProvider,
                            incomeCategoryFilter,
                            employeeJournalFactory,
                            subdivisionJournalFactory
                            ),
                        node => new IncomeCategoryViewModel(
                            EntityUoWBuilder.ForOpen(node.Id),
                            UnitOfWorkFactory.GetDefaultFactory,
                            commonServices,
                            chooserIncomeProvider,
                            incomeCategoryFilter,
                            employeeJournalFactory,
                            subdivisionJournalFactory
                            ),
                        UnitOfWorkFactory.GetDefaultFactory,
                        commonServices
                        )
                {
                    SelectionMode = JournalSelectionMode.Single
                };
                return(incomeCategoryJournalViewModel);
            });


            var expenseCategoryAutocompleteSelectorFactory =
                new SimpleEntitySelectorFactory <ExpenseCategory, ExpenseCategoryViewModel>(
                    () =>
            {
                var expenseCategoryJournalViewModel =
                    new SimpleEntityJournalViewModel <ExpenseCategory, ExpenseCategoryViewModel>(
                        x => x.Name,
                        () => new ExpenseCategoryViewModel(
                            EntityUoWBuilder.ForCreate(),
                            UnitOfWorkFactory.GetDefaultFactory,
                            ServicesConfig.CommonServices,
                            chooserExpenseProvider,
                            expenseCategoryFilter,
                            employeeJournalFactory,
                            subdivisionJournalFactory
                            ),
                        node => new ExpenseCategoryViewModel(
                            EntityUoWBuilder.ForOpen(node.Id),
                            UnitOfWorkFactory.GetDefaultFactory,
                            ServicesConfig.CommonServices,
                            chooserExpenseProvider,
                            expenseCategoryFilter,
                            employeeJournalFactory,
                            subdivisionJournalFactory
                            ),
                        UnitOfWorkFactory.GetDefaultFactory,
                        ServicesConfig.CommonServices
                        )
                {
                    SelectionMode = JournalSelectionMode.Single
                };
                expenseCategoryJournalViewModel.SetFilter(expenseCategoryFilter,
                                                          filter => Restrictions.Not(Restrictions.In("Id", filter.ExcludedIds.ToArray())));

                return(expenseCategoryJournalViewModel);
            });

            entityVMEntryCashIncomeCategory.SetEntityAutocompleteSelectorFactory(incomeCategoryAutocompleteSelectorFactory);
            entityVMEntryCashExpenseCategory.SetEntityAutocompleteSelectorFactory(expenseCategoryAutocompleteSelectorFactory);
        }
コード例 #10
0
        public CashRequestViewModel(
            IEntityUoWBuilder uowBuilder,
            IUnitOfWorkFactory unitOfWorkFactory,
            ICommonServices commonServices,
            IFileChooserProvider fileChooserProvider,
            IEmployeeRepository employeeRepository,
            ICashRepository cashRepository,
            IEmployeeJournalFactory employeeJournalFactory,
            ISubdivisionJournalFactory subdivisionJournalFactory
            ) : base(uowBuilder, unitOfWorkFactory, commonServices)
        {
            this.uowBuilder           = uowBuilder ?? throw new ArgumentNullException(nameof(uowBuilder));
            _cashRepository           = cashRepository ?? throw new ArgumentNullException(nameof(cashRepository));
            EmployeeJournalFactory    = employeeJournalFactory ?? throw new ArgumentNullException(nameof(employeeJournalFactory));
            SubdivisionJournalFactory = subdivisionJournalFactory ?? throw new ArgumentNullException(nameof(subdivisionJournalFactory));
            var filterViewModel = new ExpenseCategoryJournalFilterViewModel {
                ExcludedIds    = new CategoryRepository(new ParametersProvider()).ExpenseSelfDeliveryCategories(UoW).Select(x => x.Id),
                HidenByDefault = true
            };

            ExpenseCategoryAutocompleteSelectorFactory =
                new SimpleEntitySelectorFactory <ExpenseCategory, ExpenseCategoryViewModel>(
                    () =>
            {
                var expenseCategoryJournalViewModel =
                    new SimpleEntityJournalViewModel <ExpenseCategory, ExpenseCategoryViewModel>(
                        x => x.Name,
                        () => new ExpenseCategoryViewModel(
                            EntityUoWBuilder.ForCreate(),
                            unitOfWorkFactory,
                            ServicesConfig.CommonServices,
                            fileChooserProvider,
                            filterViewModel,
                            EmployeeJournalFactory,
                            SubdivisionJournalFactory
                            ),
                        node => new ExpenseCategoryViewModel(
                            EntityUoWBuilder.ForOpen(node.Id),
                            unitOfWorkFactory,
                            ServicesConfig.CommonServices,
                            fileChooserProvider,
                            filterViewModel,
                            EmployeeJournalFactory,
                            SubdivisionJournalFactory
                            ),
                        unitOfWorkFactory,
                        ServicesConfig.CommonServices
                        )
                {
                    SelectionMode = JournalSelectionMode.Single
                };
                expenseCategoryJournalViewModel.SetFilter(filterViewModel,
                                                          filter => Restrictions.Not(Restrictions.In("Id", filter.ExcludedIds.ToArray())));

                return(expenseCategoryJournalViewModel);
            });

            var expenseCategorySelectorFactory =
                CurrentEmployee = employeeRepository.GetEmployeeForCurrentUser(UoW);

            if (uowBuilder.IsNewEntity)
            {
                TabName = "Создание новой заявки на выдачу ДС";
            }
            else
            {
                TabName = $"{Entity.Title}";
            }

            int userId = ServicesConfig.CommonServices.UserService.CurrentUserId;

            UserRoles = getUserRoles(userId);
            IsRoleChooserSensitive = UserRoles.Count() > 1;
            UserRole = UserRoles.First();

            IsNewEntity = uowBuilder.IsNewEntity;
            ConfigureEntityChangingRelations();
        }
コード例 #11
0
        private void Configure()
        {
            #region TreeViews

            var colorRed   = new Gdk.Color(255, 0, 0);
            var colorWhite = new Gdk.Color(255, 255, 255);

            ytreeDistricts.ColumnsConfig = ColumnsConfigFactory.Create <District>()
                                           .AddColumn("Код")
                                           .HeaderAlignment(0.5f)
                                           .AddTextRenderer(x => x.Id.ToString())
                                           .AddColumn("Название")
                                           .HeaderAlignment(0.5f)
                                           .AddTextRenderer(x => x.DistrictName)
                                           .Editable()
                                           .AddColumn("Тарифная зона")
                                           .HeaderAlignment(0.5f)
                                           .AddComboRenderer(x => x.TariffZone)
                                           .SetDisplayFunc(x => x.Name)
                                           .FillItems(ViewModel.UoW.GetAll <TariffZone>().ToList(), "Нет")
                                           .Editing()
                                           .AddColumn("Мин. бутылей")
                                           .HeaderAlignment(0.5f)
                                           .AddTextRenderer(x =>
                                                            x.ObservableCommonDistrictRuleItems.Any()
                                                        ? x.ObservableCommonDistrictRuleItems.Min(c => c.DeliveryPriceRule.Water19LCount).ToString()
                                                        : "-"
                                                            )
                                           .XAlign(0.5f)
                                           .AddColumn("")
                                           .Finish();

            ytreeDistricts.Binding.AddBinding(ViewModel.Entity, e => e.ObservableDistricts, w => w.ItemsDataSource).InitializeFromSource();
            ytreeDistricts.Selection.Changed += (sender, args) => {
                if (ViewModel.IsCreatingNewBorder)
                {
                    ViewModel.CancelNewBorderCommand.Execute();
                    toggleNewBorderPreview.Active = false;
                }
                ViewModel.SelectedDistrict = ytreeDistricts.GetSelectedObject() as District;
            };

            ytreeScheduleRestrictions.ColumnsConfig = ColumnsConfigFactory.Create <DeliveryScheduleRestriction>()
                                                      .AddColumn("График")
                                                      .MinWidth(150)
                                                      .HeaderAlignment(0.5f)
                                                      .AddTextRenderer(x => x.DeliverySchedule.Name)
                                                      .AddColumn("Прием до")
                                                      .SetTag(acceptBeforeColumnTag)
                                                      .HeaderAlignment(0.5f)
                                                      .AddTextRenderer(x => x.AcceptBeforeTitle)
                                                      .AddSetter((c, r) => c.BackgroundGdk = r.AcceptBefore == null ? colorRed : colorWhite)
                                                      .Finish();
            ytreeScheduleRestrictions.Binding.AddBinding(ViewModel, vm => vm.ScheduleRestrictions, w => w.ItemsDataSource);
            ytreeScheduleRestrictions.Selection.Changed += (sender, args) =>
                                                           ViewModel.SelectedScheduleRestriction = ytreeScheduleRestrictions.GetSelectedObject() as DeliveryScheduleRestriction;

            ytreeCommonRulePrices.ColumnsConfig = ColumnsConfigFactory.Create <CommonDistrictRuleItem>()
                                                  .AddColumn("Цена")
                                                  .HeaderAlignment(0.5f)
                                                  .AddNumericRenderer(p => p.Price)
                                                  .Digits(2)
                                                  .WidthChars(10)
                                                  .Adjustment(new Adjustment(0, 0, 1000000, 1, 100, 0))
                                                  .Editing()
                                                  .AddSetter((c, r) => c.BackgroundGdk = r.Price <= 0 ? colorRed : colorWhite)
                                                  .AddTextRenderer(node => CurrencyWorks.CurrencyShortName, false)
                                                  .AddColumn("Правило")
                                                  .HeaderAlignment(0.5f)
                                                  .AddTextRenderer(p => p.DeliveryPriceRule.Title)
                                                  .WrapMode(Pango.WrapMode.WordChar)
                                                  .WrapWidth(500)
                                                  .Finish();
            ytreeCommonRulePrices.Binding.AddBinding(ViewModel, vm => vm.CommonDistrictRuleItems, w => w.ItemsDataSource);
            ytreeCommonRulePrices.Selection.Changed += (sender, args) =>
                                                       ViewModel.SelectedCommonDistrictRuleItem = ytreeCommonRulePrices.GetSelectedObject() as CommonDistrictRuleItem;

            ytreeWeekDayRulePrices.ColumnsConfig = ColumnsConfigFactory.Create <WeekDayDistrictRuleItem>()
                                                   .AddColumn("Цена")
                                                   .HeaderAlignment(0.5f)
                                                   .AddNumericRenderer(p => p.Price)
                                                   .Digits(2)
                                                   .WidthChars(10)
                                                   .Adjustment(new Adjustment(0, 0, 1000000, 1, 100, 0))
                                                   .Editing()
                                                   .AddSetter((c, r) => c.BackgroundGdk = r.Price <= 0 ? colorRed : colorWhite)
                                                   .AddTextRenderer(node => CurrencyWorks.CurrencyShortName, false)
                                                   .AddColumn("Правило")
                                                   .HeaderAlignment(0.5f)
                                                   .AddTextRenderer(p => p.DeliveryPriceRule.ToString())
                                                   .WrapMode(Pango.WrapMode.WordChar)
                                                   .WrapWidth(390)
                                                   .Finish();
            ytreeWeekDayRulePrices.Binding.AddBinding(ViewModel, vm => vm.WeekDayDistrictRuleItems, w => w.ItemsDataSource);
            ytreeWeekDayRulePrices.Selection.Changed += (sender, args) =>
                                                        ViewModel.SelectedWeekDayDistrictRuleItem = ytreeWeekDayRulePrices.GetSelectedObject() as WeekDayDistrictRuleItem;

            #endregion

            btnSave.Clicked += (sender, args) => ViewModel.Save();
            btnSave.Binding.AddFuncBinding(ViewModel, vm => vm.CanEditDistrict || vm.CanEdit, w => w.Sensitive).InitializeFromSource();

            btnCancel.Clicked += (sender, args) => ViewModel.Close(true, CloseSource.Cancel);

            ylabelStatusString.Text = ViewModel.Entity.Status.GetEnumTitle();

            entryName.Binding.AddBinding(ViewModel.Entity, e => e.Name, w => w.Text).InitializeFromSource();
            entryName.Binding.AddFuncBinding(ViewModel, vm => vm.CanEdit, w => w.Sensitive).InitializeFromSource();

            btnAddDistrict.Binding.AddFuncBinding(ViewModel, vm => vm.CanCreateDistrict, w => w.Sensitive).InitializeFromSource();
            btnAddDistrict.Clicked += (sender, args) => {
                ViewModel.AddDistrictCommand.Execute();
                ScrollToSelectedDistrict();
            };

            btnRemoveDistrict.Clicked += (sender, args) => {
                ViewModel.RemoveDistrictCommand.Execute();
                if (ViewModel.SelectedDistrict == null)
                {
                    RefreshBorders();
                }
                else
                {
                    ScrollToSelectedDistrict();
                }
            };
            btnRemoveDistrict.Binding.AddFuncBinding(ViewModel, vm => vm.SelectedDistrict != null && vm.CanDeleteDistrict, w => w.Sensitive).InitializeFromSource();

            ytextComment.Binding.AddBinding(ViewModel.Entity, e => e.Comment, w => w.Buffer.Text).InitializeFromSource();
            ytextComment.Binding.AddFuncBinding(ViewModel, vm => vm.CanEdit, w => w.Sensitive).InitializeFromSource();

            btnAddCommonRule.Binding.AddFuncBinding(ViewModel, vm => vm.SelectedDistrict != null && vm.CanEditDistrict, w => w.Sensitive).InitializeFromSource();
            btnAddCommonRule.Clicked += (sender, args) => {
                var selectRules = new OrmReference(ViewModel.UoW, DistrictRuleRepository.GetQueryOverWithAllDeliveryPriceRules())
                {
                    Mode       = OrmReferenceMode.MultiSelect,
                    ButtonMode = QS.Project.Dialogs.ReferenceButtonMode.None
                };
                selectRules.ObjectSelected +=
                    (o, e) => ViewModel.AddCommonDistrictRuleItemCommand.Execute(e.GetEntities <DeliveryPriceRule>());
                Tab.TabParent.AddSlaveTab(this.Tab, selectRules);
            };

            btnRemoveCommonRule.Binding.AddFuncBinding(ViewModel, vm => vm.CanEditDistrict && vm.SelectedDistrict != null && vm.SelectedCommonDistrictRuleItem != null, w => w.Sensitive).InitializeFromSource();
            btnRemoveCommonRule.Clicked += (sender, args) => ViewModel.RemoveCommonDistrictRuleItemCommand.Execute();

            btnToday.TooltipText  = "День в день.\nГрафик доставки при создании заказа сегодня и на сегодняшнюю дату доставки.";
            btnToday.Clicked     += (sender, args) => ViewModel.SelectedWeekDayName = WeekDayName.Today;
            btnMonday.Clicked    += (sender, args) => ViewModel.SelectedWeekDayName = WeekDayName.Monday;
            btnTuesday.Clicked   += (sender, args) => ViewModel.SelectedWeekDayName = WeekDayName.Tuesday;
            btnWednesday.Clicked += (sender, args) => ViewModel.SelectedWeekDayName = WeekDayName.Wednesday;
            btnThursday.Clicked  += (sender, args) => ViewModel.SelectedWeekDayName = WeekDayName.Thursday;
            btnFriday.Clicked    += (sender, args) => ViewModel.SelectedWeekDayName = WeekDayName.Friday;
            btnSaturday.Clicked  += (sender, args) => ViewModel.SelectedWeekDayName = WeekDayName.Saturday;
            btnSunday.Clicked    += (sender, args) => ViewModel.SelectedWeekDayName = WeekDayName.Sunday;

            btnAddSchedule.Binding.AddFuncBinding(ViewModel, vm => vm.CanEditDistrict && vm.SelectedDistrict != null && vm.SelectedWeekDayName.HasValue, w => w.Sensitive).InitializeFromSource();
            btnAddSchedule.Clicked += (sender, args) => {
                var selectSchedules = new OrmReference(typeof(DeliverySchedule), ViewModel.UoW)
                {
                    Mode = OrmReferenceMode.MultiSelect
                };
                selectSchedules.ObjectSelected += (o, eventArgs) => {
                    ViewModel.AddScheduleRestrictionCommand.Execute(eventArgs.Subjects.Cast <DeliverySchedule>());

                    if (ViewModel.SelectedScheduleRestriction != null)
                    {
                        var iter = ytreeScheduleRestrictions.YTreeModel.IterFromNode(ViewModel.SelectedScheduleRestriction);
                        var path = ytreeScheduleRestrictions.YTreeModel.GetPath(iter);
                        ytreeScheduleRestrictions.ScrollToCell(path, ytreeScheduleRestrictions.Columns.FirstOrDefault(), false, 0, 0);
                    }
                };
                Tab.TabParent.AddSlaveTab(this.Tab, selectSchedules);
            };

            btnRemoveSchedule.Binding.AddFuncBinding(ViewModel, vm => vm.CanEditDistrict && vm.SelectedDistrict != null && vm.SelectedScheduleRestriction != null, w => w.Sensitive).InitializeFromSource();
            btnRemoveSchedule.Clicked += (sender, args) => ViewModel.RemoveScheduleRestrictionCommand.Execute();

            btnAddAcceptBefore.Binding.AddFuncBinding(ViewModel, vm => vm.CanEditDistrict && vm.SelectedDistrict != null && vm.SelectedScheduleRestriction != null, w => w.Sensitive).InitializeFromSource();
            btnAddAcceptBefore.Clicked += (sender, args) => {
                var acceptBeforeTimeViewModel = new SimpleEntityJournalViewModel <AcceptBefore, AcceptBeforeViewModel>(
                    x => x.Name,
                    () => new AcceptBeforeViewModel(
                        EntityUoWBuilder.ForCreate(),
                        UnitOfWorkFactory.GetDefaultFactory,
                        ServicesConfig.CommonServices
                        ),
                    node => new AcceptBeforeViewModel(
                        EntityUoWBuilder.ForOpen(node.Id),
                        UnitOfWorkFactory.GetDefaultFactory,
                        ServicesConfig.CommonServices
                        ),
                    UnitOfWorkFactory.GetDefaultFactory,
                    ServicesConfig.CommonServices
                    );
                acceptBeforeTimeViewModel.SelectionMode = JournalSelectionMode.Single;
                acceptBeforeTimeViewModel.SetActionsVisible(deleteActionEnabled: false, editActionEnabled: false);
                acceptBeforeTimeViewModel.OnEntitySelectedResult += (o, eventArgs) => {
                    var node = eventArgs.SelectedNodes.FirstOrDefault();
                    if (node != null)
                    {
                        ViewModel.AddAcceptBeforeCommand.Execute(ViewModel.UoW.GetById <AcceptBefore>(node.Id));
                    }
                };
                Tab.TabParent.AddSlaveTab(Tab, acceptBeforeTimeViewModel);
            };

            btnRemoveAcceptBefore.Binding.AddFuncBinding(ViewModel,
                                                         vm => vm.CanEditDistrict && vm.SelectedDistrict != null && vm.SelectedScheduleRestriction != null && vm.SelectedScheduleRestriction.AcceptBefore != null,
                                                         w => w.Sensitive)
            .InitializeFromSource();
            btnRemoveAcceptBefore.Clicked += (sender, args) => ViewModel.RemoveAcceptBeforeCommand.Execute();

            btnAddWeekDayRule.Binding.AddFuncBinding(ViewModel, vm => vm.CanEditDistrict && vm.SelectedDistrict != null && vm.SelectedWeekDayName.HasValue, w => w.Sensitive).InitializeFromSource();
            btnAddWeekDayRule.Clicked += (sender, args) => {
                var selectRules = new OrmReference(ViewModel.UoW, DistrictRuleRepository.GetQueryOverWithAllDeliveryPriceRules())
                {
                    Mode       = OrmReferenceMode.MultiSelect,
                    ButtonMode = QS.Project.Dialogs.ReferenceButtonMode.None
                };
                selectRules.ObjectSelected += (o, e) =>
                                              ViewModel.AddWeekDayDistrictRuleItemCommand.Execute(e.GetEntities <DeliveryPriceRule>());
                Tab.TabParent.AddSlaveTab(this.Tab, selectRules);
            };

            btnRemoveWeekDayRule.Binding.AddFuncBinding(ViewModel, vm => vm.CanEditDistrict && vm.SelectedDistrict != null && vm.SelectedWeekDayDistrictRuleItem != null, w => w.Sensitive).InitializeFromSource();
            btnRemoveWeekDayRule.Clicked += (sender, args) => ViewModel.RemoveWeekDayDistrictRuleItemCommand.Execute();

            cmbGeoGroup.ItemsList = ViewModel.UoW.GetAll <GeographicGroup>().ToList();
            cmbGeoGroup.Binding.AddBinding(ViewModel, vm => vm.SelectedGeoGroup, w => w.SelectedItem).InitializeFromSource();
            cmbGeoGroup.Binding.AddFuncBinding(ViewModel, vm => vm.CanEditDistrict && vm.SelectedDistrict != null, w => w.Sensitive).InitializeFromSource();

            cmbWageDistrict.ItemsList = ViewModel.UoW.Session.QueryOver <WageDistrict>().Where(d => !d.IsArchive).List();
            cmbWageDistrict.Binding.AddBinding(ViewModel, vm => vm.SelectedWageDistrict, w => w.SelectedItem).InitializeFromSource();
            cmbWageDistrict.Binding.AddFuncBinding(ViewModel, vm => vm.CanEditDistrict && vm.SelectedDistrict != null && vm.CanChangeDistrictWageTypePermissionResult, w => w.Sensitive).InitializeFromSource();
            cmbWageDistrict.SetRenderTextFunc <WageDistrict>(x => x.Name);

            #region GMap

            btnAddBorder.Binding.AddFuncBinding(ViewModel, vm => !vm.IsCreatingNewBorder, w => w.Visible).InitializeFromSource();
            btnAddBorder.Binding.AddFuncBinding(ViewModel, vm => vm.CanEditDistrict && !vm.IsCreatingNewBorder && vm.SelectedDistrict != null && vm.SelectedDistrict.DistrictBorder == null, w => w.Sensitive).InitializeFromSource();
            btnAddBorder.Clicked += (sender, args) => ViewModel.CreateBorderCommand.Execute();

            btnRemoveBorder.Binding.AddFuncBinding(ViewModel, vm => !vm.IsCreatingNewBorder, w => w.Visible).InitializeFromSource();
            btnRemoveBorder.Binding.AddFuncBinding(ViewModel, vm => vm.CanEditDistrict && !vm.IsCreatingNewBorder && vm.SelectedDistrict != null && vm.SelectedDistrict.DistrictBorder != null, w => w.Sensitive).InitializeFromSource();
            btnRemoveBorder.Clicked += (sender, args) => {
                if (MessageDialogHelper.RunQuestionDialog($"Удалить границу района {ViewModel.SelectedDistrict.DistrictName}?"))
                {
                    ViewModel.RemoveBorderCommand.Execute();
                    RefreshBorders();
                }
            };

            btnConfirmNewBorder.Binding.AddFuncBinding(ViewModel, vm => vm.IsCreatingNewBorder, w => w.Visible).InitializeFromSource();
            btnConfirmNewBorder.Binding.AddFuncBinding(ViewModel, vm => vm.SelectedDistrict != null && vm.IsCreatingNewBorder, w => w.Sensitive).InitializeFromSource();
            btnConfirmNewBorder.Clicked += (sender, args) => {
                if (MessageDialogHelper.RunQuestionDialog("Завершить создание границы района?"))
                {
                    if (ViewModel.NewBorderVertices.Count < 3)
                    {
                        MessageDialogHelper.RunInfoDialog("Нельзя создать границу района меньше чем за 3 точки");
                        return;
                    }
                    toggleNewBorderPreview.Active = false;
                    ViewModel.ConfirmNewBorderCommand.Execute();
                    RefreshBorders();
                }
            };

            btnCancelNewBorder.Binding.AddFuncBinding(ViewModel, vm => vm.IsCreatingNewBorder, w => w.Visible).InitializeFromSource();
            btnCancelNewBorder.Binding.AddFuncBinding(ViewModel, vm => vm.SelectedDistrict != null && vm.IsCreatingNewBorder, w => w.Sensitive).InitializeFromSource();
            btnCancelNewBorder.Clicked += (sender, args) => {
                if (MessageDialogHelper.RunQuestionDialog("Отменить создание границы района?"))
                {
                    ViewModel.CancelNewBorderCommand.Execute();
                    toggleNewBorderPreview.Active = false;
                }
            };

            toggleNewBorderPreview.Binding.AddFuncBinding(ViewModel, vm => vm.IsCreatingNewBorder, w => w.Visible).InitializeFromSource();
            toggleNewBorderPreview.Binding.AddFuncBinding(ViewModel, vm => vm.SelectedDistrict != null && vm.IsCreatingNewBorder, w => w.Sensitive).InitializeFromSource();
            toggleNewBorderPreview.Toggled += (sender, args) => {
                if (toggleNewBorderPreview.Active && ViewModel.NewBorderVertices.Any())
                {
                    var previewBorder = new GMapPolygon(ViewModel.NewBorderVertices.ToList(), "Предпросмотр новых границ");
                    newBordersPreviewOverlay.Polygons.Add(previewBorder);
                }
                else
                {
                    newBordersPreviewOverlay.Clear();
                }
            };

            cmbMapType.ItemsEnum         = typeof(MapProviders);
            cmbMapType.EnumItemSelected += (sender, args) => gmapWidget.MapProvider = MapProvidersHelper.GetPovider((MapProviders)args.SelectedItem);
            cmbMapType.SelectedItem      = MapProviders.YandexMap;

            gmapWidget.Position      = new PointLatLng(59.93900, 30.31646);
            gmapWidget.HeightRequest = 150;
            gmapWidget.HasFrame      = true;
            gmapWidget.Overlays.Add(bordersOverlay);
            gmapWidget.Overlays.Add(newBordersPreviewOverlay);
            gmapWidget.Overlays.Add(verticeOverlay);
            RefreshBorders();

            gmapWidget.ButtonPressEvent += (o, args) => {
                if (args.Event.Button == 1 && ViewModel.IsCreatingNewBorder)
                {
                    ViewModel.AddNewVertexCommand.Execute(gmapWidget.FromLocalToLatLng((int)args.Event.X, (int)args.Event.Y));
                }
                if (args.Event.Button == 3 && ViewModel.IsCreatingNewBorder)
                {
                    var marker = verticeOverlay.Markers.FirstOrDefault(m => m.IsMouseOver);
                    if (marker == null)
                    {
                        return;
                    }

                    var pointMarker = new PointLatLng(marker.Position.Lat, marker.Position.Lng);
                    if (ViewModel.NewBorderVertices.Contains(pointMarker))
                    {
                        Menu popupMenu = new Menu();
                        var  item      = new MenuItem("Удалить");
                        item.Activated += (sender, e) => ViewModel.RemoveNewBorderVertexCommand.Execute(pointMarker);
                        popupMenu.Add(item);
                        popupMenu.ShowAll();
                        popupMenu.Popup();
                    }
                }
            };

            void RefreshBorders()
            {
                bordersOverlay.Clear();
                foreach (District district in ViewModel.Entity.ObservableDistricts)
                {
                    if (district.DistrictBorder != null)
                    {
                        bordersOverlay.Polygons.Add(new GMapPolygon(
                                                        district.DistrictBorder.Coordinates.Select(p => new PointLatLng(p.X, p.Y)).ToList(), district.DistrictName)
                                                    );
                    }
                }
            }

            #endregion

            ViewModel.PropertyChanged += (sender, args) => {
                Application.Invoke((o, eventArgs) => {
                    switch (args.PropertyName)
                    {
                    case nameof(ViewModel.SelectedWeekDayName):
                        var column     = ytreeScheduleRestrictions.ColumnsConfig.GetColumnsByTag(acceptBeforeColumnTag).First();
                        column.Visible = ViewModel.SelectedWeekDayName == WeekDayName.Today;
                        break;

                    case nameof(ViewModel.SelectedDistrict):
                        if (ViewModel.SelectedDistrict != null)
                        {
                            ytreeDistricts.SelectObject(ViewModel.SelectedDistrict);
                        }
                        break;

                    case nameof(ViewModel.SelectedScheduleRestriction):
                        if (ViewModel.SelectedScheduleRestriction != null)
                        {
                            ytreeScheduleRestrictions.SelectObject(ViewModel.SelectedScheduleRestriction);
                        }
                        break;

                    case nameof(ViewModel.SelectedCommonDistrictRuleItem):
                        if (ViewModel.SelectedCommonDistrictRuleItem != null)
                        {
                            ytreeCommonRulePrices.SelectObject(ViewModel.SelectedCommonDistrictRuleItem);
                        }
                        break;

                    case nameof(ViewModel.SelectedWeekDayDistrictRuleItem):
                        if (ViewModel.SelectedWeekDayDistrictRuleItem != null)
                        {
                            ytreeWeekDayRulePrices.SelectObject(ViewModel.SelectedWeekDayDistrictRuleItem);
                        }
                        break;

                    case nameof(ViewModel.SelectedDistrictBorderVertices):
                        verticeOverlay.Clear();
                        if (ViewModel.SelectedDistrictBorderVertices != null)
                        {
                            GMapPolygon polygon = new GMapPolygon(ViewModel.SelectedDistrictBorderVertices.ToList(), "polygon");
                            polygon.Stroke      = selectedDistrictBorderPen;
                            verticeOverlay.Polygons.Add(polygon);
                        }
                        break;

                    case nameof(ViewModel.NewBorderVertices):
                        verticeOverlay.Clear();
                        if (ViewModel.NewBorderVertices != null && ViewModel.NewBorderVertices.Any())
                        {
                            for (int i = 0; i < ViewModel.NewBorderVertices.Count; i++)
                            {
                                var color = GMarkerGoogleType.red;
                                if (i == 0)
                                {
                                    color = GMarkerGoogleType.yellow;
                                }
                                else if (i == ViewModel.NewBorderVertices.Count - 1)
                                {
                                    color = GMarkerGoogleType.green;
                                }
                                GMapMarker point = new GMarkerGoogle(ViewModel.NewBorderVertices[i], color);
                                verticeOverlay.Markers.Add(point);
                            }
                            if (toggleNewBorderPreview.Active)
                            {
                                toggleNewBorderPreview.Active = false;
                                toggleNewBorderPreview.Active = true;
                            }
                        }
                        break;
                    }
                });
            };
        }
コード例 #12
0
        private void ConfigureDlg()
        {
            fuelbalanceview.ViewModel = ViewModel.FuelBalanceViewModel;

            ydatepickerDate.Binding.AddBinding(ViewModel.Entity, e => e.Date, w => w.Date).InitializeFromSource();
            ydatepickerDate.Binding.AddBinding(ViewModel, e => e.CanEditDate, w => w.Sensitive).InitializeFromSource();
            ylabelCashierValue.Binding.AddBinding(ViewModel.Entity, e => e.Cashier, w => w.LabelProp, new EmployeeToLastNameWithInitialsConverter()).InitializeFromSource();

            var expenseCategorySelectorFactory = new SimpleEntitySelectorFactory <ExpenseCategory, ExpenseCategoryViewModel>(
                () => {
                var expenseCategoryJournalViewModel = new SimpleEntityJournalViewModel <ExpenseCategory, ExpenseCategoryViewModel>(
                    x => x.Name,
                    () => new ExpenseCategoryViewModel(
                        EntityUoWBuilder.ForCreate(),
                        UnitOfWorkFactory.GetDefaultFactory,
                        ServicesConfig.CommonServices,
                        ViewModel.fileChooserProvider,
                        ViewModel.expenseCategoryJournalFilterViewModel,
                        ViewModel.EmployeeJournalFactory,
                        ViewModel.SubdivisionJournalFactory
                        ),
                    (node) => new ExpenseCategoryViewModel(
                        EntityUoWBuilder.ForOpen(node.Id),
                        UnitOfWorkFactory.GetDefaultFactory,
                        ServicesConfig.CommonServices,
                        ViewModel.fileChooserProvider,
                        ViewModel.expenseCategoryJournalFilterViewModel,
                        ViewModel.EmployeeJournalFactory,
                        ViewModel.SubdivisionJournalFactory
                        ),
                    UnitOfWorkFactory.GetDefaultFactory,
                    ServicesConfig.CommonServices
                    )
                {
                    SelectionMode = JournalSelectionMode.Single
                };
                return(expenseCategoryJournalViewModel);
            }
                );

            entryExpenseCategory.SetEntityAutocompleteSelectorFactory(expenseCategorySelectorFactory);
            entryExpenseCategory.Binding.AddBinding(ViewModel.Entity, e => e.ExpenseCategory, w => w.Subject).InitializeFromSource();
            entryExpenseCategory.Binding.AddBinding(ViewModel, vm => vm.CanEdit, w => w.Sensitive).InitializeFromSource();

            entryEmployee.SetEntityAutocompleteSelectorFactory(ViewModel.EmployeeAutocompleteSelectorFactory);
            entryEmployee.Binding.AddBinding(ViewModel.Entity, e => e.Employee, w => w.Subject).InitializeFromSource();
            entryEmployee.Binding.AddBinding(ViewModel, vm => vm.CanEdit, w => w.Sensitive).InitializeFromSource();

            ycomboboxCashSubdivision.SetRenderTextFunc <Subdivision>(s => s.Name);
            ycomboboxCashSubdivision.Binding.AddBinding(ViewModel, vm => vm.AvailableSubdivisions, w => w.ItemsList).InitializeFromSource();
            ycomboboxCashSubdivision.Binding.AddBinding(ViewModel.Entity, e => e.CashSubdivision, w => w.SelectedItem).InitializeFromSource();
            ycomboboxCashSubdivision.Binding.AddBinding(ViewModel, vm => vm.CanEdit, w => w.Sensitive).InitializeFromSource();

            ytextviewReason.Binding.AddBinding(ViewModel.Entity, vm => vm.Reason, w => w.Buffer.Text).InitializeFromSource();
            ytextviewReason.Binding.AddBinding(ViewModel, vm => vm.CanEdit, w => w.Sensitive).InitializeFromSource();

            ytreeviewItems.ColumnsConfig = FluentColumnsConfig <FuelWriteoffDocumentItem> .Create()
                                           .AddColumn("Топливо").AddTextRenderer(x => x.FuelType.Name)
                                           .AddColumn("Количество").AddNumericRenderer(x => x.Liters)
                                           .AddSetter((c, n) => c.Editable   = ViewModel.CanEdit)
                                           .AddSetter((c, n) => c.Adjustment = new Gtk.Adjustment(0, 0, (double)ViewModel.GetAvailableLiters(n.FuelType), 1, 10, 0))
                                           .Finish();

            ytreeviewItems.Selection.Mode     = Gtk.SelectionMode.Single;
            ytreeviewItems.ItemsDataSource    = ViewModel.Entity.ObservableFuelWriteoffDocumentItems;
            ytreeviewItems.Selection.Changed += (sender, e) => {
                ViewModel.AddWriteoffItemCommand.RaiseCanExecuteChanged();
                ViewModel.DeleteWriteoffItemCommand.RaiseCanExecuteChanged();
            };

            ybuttonAddItem.Clicked  += (sender, e) => ViewModel.AddWriteoffItemCommand.Execute();
            ybuttonAddItem.Sensitive = ViewModel.AddWriteoffItemCommand.CanExecute();
            ViewModel.AddWriteoffItemCommand.CanExecuteChanged += (sender, e) => { ybuttonAddItem.Sensitive = ViewModel.AddWriteoffItemCommand.CanExecute(); };

            ybuttonDeleteItem.Clicked  += (sender, e) => ViewModel.DeleteWriteoffItemCommand.Execute(GetSelectedItem());
            ybuttonDeleteItem.Sensitive = ViewModel.DeleteWriteoffItemCommand.CanExecute(GetSelectedItem());
            ViewModel.DeleteWriteoffItemCommand.CanExecuteChanged += (sender, e) => { ybuttonDeleteItem.Sensitive = ViewModel.DeleteWriteoffItemCommand.CanExecute(GetSelectedItem()); };

            buttonSave.Clicked   += (sender, e) => { ViewModel.SaveAndClose(); };
            buttonCancel.Clicked += (sender, e) => { ViewModel.Close(true, QS.Navigation.CloseSource.Cancel); };

            buttonPrint.Clicked  += (sender, e) => { ViewModel.PrintCommand.Execute(); };
            buttonPrint.Sensitive = ViewModel.PrintCommand.CanExecute();
            ViewModel.PrintCommand.CanExecuteChanged += (sender, e) => { buttonPrint.Sensitive = ViewModel.PrintCommand.CanExecute(); };
        }