Chr☆s Kwok 的技术笔记

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

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

1、接口IProcedure添加属性:

/// <summary>
/// 
/// </summary>
string OtherProcedureIds { get; set; }
/// <summary>
/// 其他手术列表
/// </summary>
IList<IProcedure> OtherProcedures { get; }        

2、实现类Procedure添加实现:

protected override void SetDto(DtoProcedure dto)
{
	base.SetDto(dto);
	_otherProcedures = null;
}

public string OtherProcedureIds
{
	get { return Dto.OtherProcedureIds; }
	set
	{
		_otherProcedures = null;
		Dto.OtherProcedureIds = value;
		OnPropertyChanged(a => a.OtherProcedureIds);
		OnPropertyChanged(a => a.OtherProcedures);
	}
}

private IList<IProcedure> _otherProcedures = null;
public IList<IProcedure> OtherProcedures
{
	get
	{
		if (_otherProcedures == null)
		{
			_otherProcedures = new List<IProcedure>();
			var ids = OtherProcedureIds.Split<int>(",");
			foreach (var procedureId in ids)
			{
				_otherProcedures.AddRange(Repository.GetByKey(procedureId));
			}
		}
		return _otherProcedures;
	}
}

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

3、维护表示器ProcedureDetailViewPresenter.cs增加属性(用于多选或排序的表示器):

private PickableEntitiesSortingPresenter _sortingPresenter;
public PickableEntitiesSortingPresenter PickableEntitiesSortingPresenter
{
	get
	{
		if (_sortingPresenter == null)
		{
			_sortingPresenter = this.UseCase.Items.GetOrCreate<PickableEntitiesSortingPresenter>(Guid.NewGuid().ToString(), SearchMode.Local);
			IRegion region = UseCaseItem.Current.Regions[RegionNames.DialogRegion];
			_sortingPresenter.AttachRegion(region);
			_sortingPresenter.ViewPart.SetViewResizeMode(JetSun.Presentation.Markups.ViewResizeMode.NoResize);
			_sortingPresenter.ViewPart.Width = 640;
			_sortingPresenter.ViewPart.Height = 480;
			_sortingPresenter.IsSelectorUsage = false;
			_sortingPresenter.ViewPart.SetRegionHeader("其他手术排序维护");
		}
		return _sortingPresenter;
	}
}

4、维护视图ProcedureDetailView.xaml.cs增加相关代码:

EntityPicker _pckOtherProcedures;
private void InitPickers(IBindingCollection<IProcedure> bindings)
{
	EntityPickerManager pickerManager = EntityPickerManager.GetOrCreate(Presenter.UseCase);

	_pckOtherProcedures = new EntityPicker(_txtOtherProcedures, typeof(IProcedure));
	_pckOtherProcedures.IsMultiSelected = true;
	_pckOtherProcedures.UnselectReturnCurrent = false;
	_pckOtherProcedures.AllowDefaultView = false;
	_pckOtherProcedures.DataAcceptor = AcceptOtherProcedureIds;
	_pckOtherProcedures.DataProvider = ProcedureSelectedProvider;
	_pckOtherProcedures.DefaultMulitSelectedItems = GetOtherProcedureItems;
	pickerManager.Register(_pckOtherProcedures);
}

private IList ProcedureSelectedProvider()
{
	return ProcedureRepository.GetByPredicate(ProcedureRepository.Criterias.IsDeleted.Equal(false)).AsList();
}

private ActionResult AcceptOtherProcedureIds(PickResult result)
{
	(_bindings.CurrentEntity as IProcedure).OtherProcedureIds = string.Join(",", result.Items.CastAs<IProcedure>().Where(a => !a.IsDeleted && !a.IsEmpty).Select(a => a.Id));
	_txtOtherProcedures.SetText((_bindings.CurrentEntity as IProcedure).OtherProcedures.Select(a => a.Name).ToString(","));
	this.RaiseEditedEvent(new EditedEventArgs(_bindings.CurrentEntity, EditState.Update, "OtherProcedureIds"));
	return ActionResult.Success;
}

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

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

private void _btnSort_Click(object sender, RoutedEventArgs e)
{
	IProcedure current = _bindings.CurrentEntity as IProcedure;
	var list = current.OtherProcedures.CastAs<IPickableObject>().ToList();
	var presenter = Presenter.PickableEntitiesSortingPresenter;
	presenter.RefreshData(list);
	presenter.ShowView();
	if (presenter.IsOK)
	{
		string source = current.OtherProcedureIds;
		string target = presenter.Entities.Select(a => a.Id).ToString(",");
		current.OtherProcedureIds = target;
		_txtOtherProcedures.SetText(current.OtherProcedures.Select(a => a.Name).ToString(","));
		this.RaiseEditedEvent(new EditedEventArgs(_bindings.CurrentEntity, EditState.Update, "OtherProcedureIds"));
	}
}

private IProcedureRepository _procedureRepository;
public IProcedureRepository ProcedureRepository
{
	get
	{
		if (_procedureRepository == null)
			_procedureRepository = ModuleBase.RootContainer.Resolve<IProcedureRepository>();
		return _procedureRepository;
	}
}

 5、维护视图ProcedureDetailView.xaml布局增加控件元素:

        <Label Content="其他手术" Grid.Row="17"  />
        <Grid Grid.Row="17" Grid.Column="1" >
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="20" />
            </Grid.ColumnDefinitions>
            <TextBox Name="_txtOtherProcedures" MaxLength="5000" Grid.Column="0"/>
            <Button Grid.Column="1" Name="_btnSort" Click="_btnSort_Click" HorizontalAlignment="Right" VerticalAlignment="Center" 
                Content="..." Width="20" FontSize="14" FontWeight="Bold" Height="20"
                Padding="0" BorderThickness="1"  />
        </Grid>

6、下面是实现多选或排序字典实体本身功能:
6.1 PickableEntitiesSortingView.xaml

<UserControl x:Class="JetSun.PatientAdministration.Layout.PickableEntitiesSortingView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <ToolBarTray Name="_toolBarTray" Grid.Row="0"  VerticalAlignment="Top">
            <ToolBar HorizontalAlignment="Left" Name="_tlbMain" />
        </ToolBarTray>
        <Grid Grid.Row="1" Name="_mainGrid">
            <ContentControl Name="_Grid" />
        </Grid>
    </Grid>
</UserControl>

6.2 定义一个支持的表格设置文件:

<DataGrid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:js="http://schemas.jetsun.com.cn/his/2009/presentation"
    xmlns:sys="clr-namespace:System;assembly=mscorlib">
    <DataGrid.Columns>
        <DataGridTextColumn IsReadOnly="True" Header="名称" Width="160" Binding="{Binding Path=Name}" />
        <DataGridTextColumn IsReadOnly="True" Header="编码" Width="80" Binding="{Binding Path=Code}" />
        <DataGridTextColumn IsReadOnly="True" Header="拼音码" Width="80" Binding="{Binding Path=SpellCode}" />
        <DataGridTextColumn IsReadOnly="True" Header="五笔码" Width="80" Binding="{Binding Path=WBCode}" />
    </DataGrid.Columns>
</DataGrid>

6.3 PickableEntitiesSortingView.xaml.cs

using System.Windows.Controls;
using JetSun.Infrastructure;
using JetSun.DomainModel;
using JetSun.Presentation;

namespace JetSun.PatientAdministration.Layout
{
    /// <summary>
    /// PickableEntitiesSortingView.xaml 的交互逻辑
    /// </summary>
    [DefaultMapping(typeof(IPickableEntitiesSortingView))]
    public partial class PickableEntitiesSortingView : UserControl, IPickableEntitiesSortingView
    {
        public PickableEntitiesSortingView()
        {
            InitializeComponent();
        }

        public ToolBar MainBar
        {
            get { return _tlbMain; }
        }

        public void FillGrid(DataGrid mainGrid)
        {
            _Grid.Content = mainGrid;
        }

        public PickableEntitiesSortingPresenter Presenter { get; set; }

        //IBindingCollection<IPickableObject> _bindings = null;
        public void OnBindingManagerReady(IBindingManager bindingManager)
        {
            //_bindings = bindingManager.GetCollection<IPickableObject>(this);
            //_bindings.AddBinding(_Code, a => a.Code);
            //_bindings.AddBinding(_Name, a => a.Name);
            //_bindings.AddBinding(_Note, a => a.Note).Binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
            //_bindings.CurrentChanged -= _bindings_CurrentChanged;
            //_bindings.CurrentChanged += _bindings_CurrentChanged;
            //_bindings.Edited -= _bindings_Edited;
            //_bindings.Edited += _bindings_Edited;
        }
    }
}

6.4 实现表示器PickableEntitiesSortingPresenter.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using JetSun.Presentation;
using System.Windows.Controls;
using Microsoft.Practices.Prism.Commands;
using JetSun.DomainModel;
using JetSun.Infrastructure;
using System.Windows;
using JetSun.Presentation.Markups;
using JetSun.PatientAdministration.Presentation;

namespace JetSun.PatientAdministration.Layout
{
    [DefaultMapping(typeof(IPickableEntitiesSortingPresenter))]
    public class PickableEntitiesSortingPresenter : Presenter<IPickableEntitiesSortingView>, IPickableEntitiesSortingPresenter, ICloseAware
    {
        #region override
        protected override void OnBuiltUp(object buildKey)
        {
            base.OnBuiltUp(buildKey);
            InitCommands();
            InitDataGrid();
            InitControls();
        }

        protected override void OnViewLoaded()
        {
            base.OnViewLoaded();
        }
        #endregion

        #region InitControls
        private IBindingManager _bindingManager;
        private void InitControls()
        {
            _bindingManager = UseCase.Items.GetOrCreate<IBindingManager>(Guid.NewGuid().ToString(), SearchMode.Local);
            View.OnBindingManagerReady(_bindingManager);
            _bindingManager.Edited += new EventHandler<EditedEventArgs>(_bindingManager_Edited);
        }

        void _bindingManager_Edited(object sender, EditedEventArgs e)
        {
            MainCommands[CommandNames.Save].SetStatus(true);
        }
        #endregion

        #region InitDataGrid
        SelectorFacade _selector;
        IDataGridManager<IPickableObject> _gridManager;
        private const string conMainGrid = "PickableObjectDataGrid";
        private void InitDataGrid()
        {
            _gridManager = UseCase.Items.AddNew<IDataGridManager<IPickableObject>>();
            _gridManager.Load(new DataGridKind(typeof(IPickableObject), ShellEnvironment.GetResourceUri(conMainGrid)), null, true);
            _gridManager.IsReadOnly = true;
            _gridManager.AllowAdd = false;
            _gridManager.AllowEdit = false;
            _gridManager.AllowRemove = false;
            _gridManager.AllowSort = true;
            _gridManager.BackupMode = EntityBackupMode.Items;
            _gridManager.DataGrid.SelectionMode = DataGridSelectionMode.Single;
            _gridManager.DataGrid.SelectionUnit = DataGridSelectionUnit.FullRow;

            this.View.FillGrid(_gridManager.DataGrid);
        }
        #endregion

        #region InitCommands
        private ToolBarCommandCollection _mainCommands;
        private ToolBarCommandCollection MainCommands
        {
            get
            {
                if (_mainCommands == null)
                    _mainCommands = UseCase.Items.GetOrCreate<ToolBarCommandCollection>(Guid.NewGuid().ToString(), Infrastructure.SearchMode.Local);
                return _mainCommands;
            }
        }

        private ToolBarCommandCollection _itemCommands;
        private ToolBarCommandCollection ItemCommands
        {
            get
            {
                if (_itemCommands == null)
                    _itemCommands = UseCase.Items.GetOrCreate<ToolBarCommandCollection>(Guid.NewGuid().ToString(), Infrastructure.SearchMode.Local);
                return _itemCommands;
            }
        }

        private bool _isDataChanged;
        public bool IsDataChanged
        {
            get { return _isDataChanged; }

            private set
            {
                _isDataChanged = value;
                MainCommands[CommandNames.Save].SetStatus(value);
            }
        }

        CommandItem _splitCommandItem = new CommandItem();
        private void InitCommands()
        {
            CommandItem root = CommandItem.CreateRoot();
            root.Children.AddRange(CommandNames.MoveUp, CommandNames.MoveDown, _splitCommandItem, CommandNames.Confirm, new CommandItem(), CommandNames.Exit);
            MainCommands.Attach(string.Empty, View.MainBar, root.Children, UseCase);
            MainCommands[CommandNames.MoveUp].RegisterCommand(new DelegateCommand(this.ExecMoveUp));
            MainCommands[CommandNames.MoveDown].RegisterCommand(new DelegateCommand(this.ExecMoveDown));
            MainCommands[CommandNames.Confirm].RegisterCommand(new DelegateCommand<object>(this.ExecSave));
            MainCommands[CommandNames.Exit].RegisterCommand(new DelegateCommand(this.ExecExit));
        }

        public IList<IBusinessObject<int>> GetSelectedItems()
        {
            IList<IBusinessObject<int>> selectItems = new List<IBusinessObject<int>>();
            if (_selector != null)
            {
                selectItems = _selector.SelectedItems.CastAs<IBusinessObject<int>>().ToList();
            }

            return selectItems;
        }

        private bool _isSelectorUsage;
        public bool IsSelectorUsage
        {
            get { return _isSelectorUsage; }
            set
            {
                _isSelectorUsage = value;
                if (value)
                {
                    if (_selector == null)
                    {
                        _selector = SelectorFacadeFactory.CreateFacade(_gridManager.DataGrid);
                        _selector.IsMultiSelected = true;
                        _selector.UnselectReturnCurrent = false;
                        _selector.ItemSelectChanged -= _selector_ItemSelectChanged;
                        _selector.ItemSelectChanged += _selector_ItemSelectChanged;
                    }
                    MainCommands[CommandNames.MoveUp].Status = CommandStatus.Unavailable;
                    MainCommands[CommandNames.MoveDown].Status = CommandStatus.Unavailable;
                    _splitCommandItem.Control.Visibility = Visibility.Collapsed;
                }
                else
                {
                    MainCommands[CommandNames.MoveUp].SetStatus(true);
                    MainCommands[CommandNames.MoveDown].SetStatus(true);
                    _splitCommandItem.Control.Visibility = Visibility.Visible;
                }
            }
        }

        private void _selector_ItemSelectChanged(object sender, EventArgs<object> e)
        {
            this.IsDataChanged = true;
        }

        public IList<IBusinessObject<int>> BackupEntities { get; private set; }
        public void RefreshData(IList<IPickableObject> entities)
        {
            this.BackupEntities = entities.CastAs<IBusinessObject<int>>().ToList();
            _gridManager.BindTo(entities);
            if (_selector != null)
                _selector.Clear();

            this._askSaved = false;
            this.IsDataChanged = false;
            this.IsOK = false;
        }

        private void ExecMoveUp()
        {
            MoveCurrent(-1);
        }

        private void ExecMoveDown()
        {
            MoveCurrent(1);
        }

        private void MoveCurrent(int offset)
        {
            IPickableObject model = _gridManager.Current;
            IPickableObject next = GetNext(model, offset);
            if (next == null) return;

            _gridManager.Move(model, offset);
            _gridManager.DataGrid.SetCurrentRow(model, true);
            _gridManager.DataGrid.Focus();
            OnEdit(EditedEventArgs.AnonymousUpdate);
            this.IsDataChanged = true;
        }

        private IPickableObject GetNext(IPickableObject model, int offset)
        {
            if (model == null) return null;

            int index = _gridManager.IndexOf(model);
            return _gridManager.GetItem(index + offset);
        }

        public event EventHandler<EditedEventArgs> Edited;
        private void OnEdit(EditedEventArgs e)
        {
            ViewPart.RaiseEditedEvent(e);
            if (Edited != null)
                Edited(this, e);
        }
        public bool IsOK { get; private set; }
        public IList<IBusinessObject<int>> Entities { get; private set; }
        private void ExecSave(object parameter)
        {
            this._askSaved = true;
            if (this.IsDataChanged || this.GetSelectedItems().Count > 0)
            {
                this.IsOK = true;
                IList<IPickableObject> items = _gridManager.AsEnumerable().ToList();
                this.Entities = items.CastAs<IBusinessObject<int>>().ToList();
            }

            bool hidden = true;
            if (parameter != null)
            {
                hidden = (bool)parameter;
            }

            if (hidden)
            {
                this.HideView();
            }
        }

        private bool _askSaved;
        private bool AskSaved()
        {
            _askSaved = true;
            if (this.IsSelectorUsage)
            {
                if (this.GetSelectedItems().Count > 0)
                {
                    if (MessageHelper.ShowDialog("已有选定其他手术,是否复制?", "提示", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
                    {
                        return true;
                    }
                }
            }
            else
            {
                if (this.IsDataChanged)
                {
                    if (MessageHelper.ShowDialog("排序已修改,是否更新排序?", "提示", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
                    {
                        return true;
                    }
                }
            }

            return false;
        }

        private void ExecExit()
        {
            if (AskSaved())
            {
                ExecSave(false);
            }

            this.HideView();
        }

        #endregion

        #region ICloseAware
        public void OnClosed()
        {
        }

        public void OnClosing(ref bool cancel)
        {
            if (!_askSaved && AskSaved())
            {
                ExecSave(false);
            }
        }
        #endregion
    }

    public interface IPickableEntitiesSortingView : IDetailView, IPresenterDependent<PickableEntitiesSortingPresenter>
    {
        ToolBar MainBar { get; }
        void FillGrid(DataGrid mainGrid);
    }
    
    public interface IPickableEntitiesSortingPresenter : IPresenter, IPresenterBase, IViewPresenter, IBuilderAware
    {
        bool IsSelectorUsage { get; set; }
        IList<IBusinessObject<int>> GetSelectedItems();
        void RefreshData(IList<IPickableObject> entities);
        bool IsDataChanged { get; }
        bool IsOK { get; }
        IList<IBusinessObject<int>> Entities { get; }
    }
}

 

posted on 2025-11-26 11:17  Chr☆s  阅读(1)  评论(0)    收藏  举报