Chr☆s Kwok 的技术笔记

.NET, C#, WPF, WCF, WF, .NetCore & LINQ ... I know how it works because I know why it works ...

博客园 首页 新随笔 订阅 管理

关于多选拾取器的通用处理逻辑代码范例:

    /// <summary>
    /// 手术处置明细视图实现
    /// </summary>
    [DefaultMapping(typeof(IProcedureDetailView))]
    public partial class ProcedureDetailView : UserControl, IProcedureDetailView
    {
        IBindingCollection<IProcedure> _bindings;
        public void OnBindingManagerReady(IBindingManager bindingManager)
        {
            _bindings = bindingManager.GetCollection<IProcedure>(this);
            _bindings.AddBinding(_txtCode, r => r.Code).Binding.Mode = BindingMode.TwoWay;
            _bindings.AddBinding(_txtName, r => r.Name);
            _bindings.AddBinding(_cbIsNeedEMRDoc, CheckBox.IsCheckedProperty, r => r.IsNeedEmrDoc);
            _bindings.AddBinding(_txtUnitPrice, r => r.UnitPrice);

            _bindings.AddBinding(_lblStatus, r => r).Binding.Converter = new ObjectStateStatusDescriptionConverter();
            _lblStatus.SizeChanged += lblStatus_SizeChanged;

            _bindings.AddBinding(_txtLevel, r => r.LevelCode.Name);
            _bindings.AddBinding(_txtProcedureKind, r => r.ProcedureKind.Name);

            InitPickers(_bindings);
        }
		
        EntityPicker _pckOperateOrgs;
        EntityPicker _pckOperators;
        private void InitPickers(IBindingCollection<IProcedure> bindings)
        {
            EntityPickerManager pickerManager = EntityPickerManager.GetOrCreate(Presenter.UseCase);
			
            _pckOperators = new EntityPicker(_txtOperators, typeof(IEmployee));
            _pckOperators.IsMultiSelected = true;
            _pckOperators.DataProvider = GetAllEmployees;
            _pckOperators.EntityPredicate = CriteriaHelper.CreatePredicate<IEmployee>(a => !a.IsDeleted && !a.IsEmpty && !string.IsNullOrEmpty(a.MedicareCode) && a.MedicareCode.StartsWith("D"));
            _pckOperators.DataAcceptor = AcceptOperatorIds;
            _pckOperators.DefaultMulitSelectedItems = GetOperatorItems;
            pickerManager.Register(_pckOperators);

            _pckOperateOrgs = new EntityPicker(_txtOperateOrgs, typeof(IOrganization));
            _pckOperateOrgs.IsMultiSelected = true;
            _pckOperateOrgs.DataProvider = GetIPOrganizations;
            _pckOperateOrgs.GetExtendViews += pckIPOrgs_GetExtendViews;
            _pckOperateOrgs.DataAcceptor = AcceptOperateOrganizationIds;
            _pckOperateOrgs.DefaultMulitSelectedItems = GetOperateOrganizationItems;
            pickerManager.Register(_pckOperateOrgs);
        }

        private ActionResult AcceptOperatorIds(PickResult result)
        {
            _pckOperators.SetEditText(string.Join(",", result.Items.CastAs<IEmployee>().OrderBy(a => a.Name).Select(a => a.Name)));
            (_bindings.CurrentEntity as IProcedure).OperatorEmpIds = string.Join(",", result.Items.CastAs<IEmployee>().Where(a => !a.IsDeleted && !a.IsEmpty).Select(a => a.Id));
            this.RaiseEditedEvent(new EditedEventArgs(_bindings.CurrentEntity, EditState.Update, "OperatorEmpIds"));
            return ActionResult.Success;
        }

        private ActionResult AcceptOperateOrganizationIds(PickResult result)
        {
            _pckOperateOrgs.SetEditText(string.Join(",", result.Items.CastAs<IOrganization>().OrderBy(a => a.Name).Select(a => a.Name)));
            (_bindings.CurrentEntity as IProcedure).OperateOrgIds = string.Join(",", result.Items.CastAs<IOrganization>().Where(a => !a.IsDeleted && !a.IsEmpty).Select(a => a.Id));
            this.RaiseEditedEvent(new EditedEventArgs(_bindings.CurrentEntity, EditState.Update, "OperateOrgIds"));
            return ActionResult.Success;
        }

        private IList GetOperatorItems()
        {
            var entity = _bindings.CurrentEntity as IProcedure;
            if (entity == null) return null;

            return (_bindings.CurrentEntity as IProcedure).Operators.ToList();
        }

        private IList GetOperateOrganizationItems()
        {
            var entity = _bindings.CurrentEntity as IProcedure;
            if (entity == null) return null;

            return (_bindings.CurrentEntity as IProcedure).OperateOrganizations.ToList();
        }

        private IList GetAllEmployees()
        {
            IEmployeeRepository r = ModuleBase.RootContainer.Resolve<IEmployeeRepository>();
            return r.GetByPredicate(r.Criterias.IsDeleted.Not()).ToList();
        }

        private IList GetIPOrganizations()
        {
            CheckCacheReloadSetting(ref _isOrgLoaded);
            var repository = ModuleBase.RootContainer.Resolve<IOrganizationRepository>();
            using (repository.CoerceRefreshing())
            {
                return repository.GetByTreeKinds(new OrganizationTreeKind[] { OrganizationTreeKind.IPTreeKind }).ToList();
            }
        }

        private void pckIPOrgs_GetExtendViews(object sender, EventArgs<System.Collections.Generic.IDictionary<object, EntityPickExtViewPosition>> e)
        {
            var key = this.Presenter.UseCase.Items.GetOrCreate<IPDepartmentCatalogPresenter>(SearchMode.Local);
            key.DefaultSelectItemIndex = 3;
            e.Data.Add(key, EntityPickExtViewPosition.Right);
            _pckOperateOrgs.GetExtendViews -= pckIPOrgs_GetExtendViews;
        }

        public void SetControlsText()
        {
            _txtOperators.Text = "";
            _txtOperateOrgs.Text = "";
            var entity = _bindings.CurrentEntity as IProcedure;
            if (entity != null)
            {
                _txtOperators.SetText(entity.Operators.Select(a => a.Name).ToString(","));
                _txtOperateOrgs.SetText(entity.OperateOrganizations.Select(a => a.Name).ToString(","));
            }
        }
	}
		
    /// <summary>
    /// 手术处置明细视图表示器
    /// </summary>
    public class ProcedureDetailViewPresenter : DetailViewPresenter<IProcedureDetailView, IProcedure>
    {      
        protected override void OnCurrentChanged()
        {
            base.OnCurrentChanged();
            View.SetControlsText();
        }

    }
	
    /// <summary>
    /// 手术处置明细视图接口
    /// </summary>
    public interface IProcedureDetailView : IPresenterDependent<ProcedureDetailViewPresenter>, IDetailView
    {
        void SetControlsText();
    }	

    /// <summary>
    /// 手术处置实现类
    /// </summary>
    public class Procedure : DomainModelBase<IProcedure, DtoProcedure>, IProcedure
    {
        protected override void SetDto(DtoProcedure dto)
        {
            base.SetDto(dto);

            _operators = null;
            _operateOrgs = null;
        }
		
        public string OperatorEmpIds
        {
            get { return Dto.OperatorEmpIds; }
            set 
            {
                _operators = null;
                Dto.OperatorEmpIds = value; 
                OnPropertyChanged(a => a.OperatorEmpIds); 
            }
        }

        public string OperateOrgIds
        {
            get { return Dto.OperateOrgIds; }
            set 
            {
                _operateOrgs = null;
                Dto.OperateOrgIds = value; 
                OnPropertyChanged(a => a.OperateOrgIds); 
            }
        }

        private IList<IEmployee> _operators = null;
        public IList<IEmployee> Operators
        {
            get
            {
                if (_operators == null)
                {
                    _operators = new List<IEmployee>();
                    var ids = OperatorEmpIds.Split<int>(",");
                    foreach (var empId in ids)
                    {
                        _operators.AddRange(EmployeeRepository.GetByKey(empId));
                    }
                }
                return _operators;
            }
        }

        static IEmployeeRepository EmployeeRepository
        {
            get { return UseCaseItem.Current.Items.GetOrCreate<IEmployeeRepository>(SearchMode.Up); }
        }

        private IList<IOrganization> _operateOrgs = null;
        public IList<IOrganization> OperateOrganizations
        {
            get
            {
                if (_operateOrgs == null)
                {
                    _operateOrgs = new List<IOrganization>();
                    var ids = OperateOrgIds.Split<int>(",");
                    foreach (var orgId in ids)
                    {
                        _operateOrgs.AddRange(OrganizationRepository.GetByKey(orgId));
                    }
                }
                return _operateOrgs;
            }
        }

        static IOrganizationRepository OrganizationRepository
        {
            get { return UseCaseItem.Current.Items.GetOrCreate<IOrganizationRepository>(SearchMode.Up); }
        }
	}
	
    [Description("手术处置")]
    public interface IProcedure : ICodedValue, IConsumable 
    {
        /// <summary>
        /// 
        /// </summary>
        string OperatorEmpIds { get; set; }
        /// <summary>
        /// 术者列表
        /// </summary>
        IList<IEmployee> Operators { get; }
        /// <summary>
        /// 
        /// </summary>
        string OperateOrgIds { get; set; }
        /// <summary>
        /// 专科手术科室
        /// </summary>
        IList<IOrganization> OperateOrganizations { get; }
    }

 

posted on 2025-04-18 10:52  Chr☆s  阅读(3)  评论(0)    收藏  举报