关于多选拾取器的通用处理逻辑代码范例:
/// <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; }
}