0

当用户单击表单上的“下一步”按钮时,我想实现可以切换 tabItems(TabItem1、TabItem2、TabItem3)的功能。出于这个原因,我想使用状态机模式。

这些东西我已经实现了,但是我不知道对不对?:

public abstract class State
    {
        #region Constructros
           public State()
        {
        }


        public State(State state)
        {
            this.CurrentState = state.CurrentState;
            this.PreviousState = state.PreviousState;
            this.NextState = state.NextState;
        }


        public State(Machine machine,string strCurrentState,string strPreviousState,string strNextState)
        {
            this.CurrentState = strCurrentState;
            this.PreviousState = strPreviousState;
            this.NextState = strNextState;
            this.SetParams();
        }
        #endregion

        public const string WELCOME             = "WELCOME";
        public const string EMR_CONFIGURATION   = "EMR_CONFIGURATION";
        public const string MIGRATION           = "MIGRATION";
        public const string END_OF_STATES       = "END_OF_STATES";


        private Machine machine;
        private string currentState;
        private string previousState;
        private string nextState;
        private string nameState;

        public virtual void SetParams() { }
        public virtual void ChangeState(Machine m, State s)
        {
            m.ChangeState(s);
        }


        //Get The name of State
        public Machine Machine
        {
            get { return this.machine; }
            set { this.machine = value; }
        }

        //Current State
        public string CurrentState
        {
            get { return this.currentState; }
            set { this.currentState = value; }
        }
        //Previous State
        public string PreviousState
        {
            get { return this.previousState; }
            set { this.previousState = value; }
        }
        //Next State
        public string NextState
        {
            get { return this.nextState; }
            set { this.nextState = value; }
        }

        public string NameState
        {
            get { return this.nameState; }
            set { this.nameState = value; }
        }

    }

 public class Machine
    {
        public State currentState;

        public Machine (string strCurrentState,string strPreviousState,string strNextState)
        {
            currentState = new WelcomeState(this, strCurrentState, strPreviousState, strNextState);
        }

        public void ChangeState(State setState)
        {
            currentState = setState; 
        }

        public void  SetCurrentState (string state)
        {
            currentState.CurrentState = state;
        }
    }

 class Transition
    {
        public State state;
        private static Transition getInstance;
        protected Transition(){}

        public static Transition GetInstance()
        {
            if (getInstance == null)
            {
                getInstance = new Transition();
            }
            return getInstance;
        }

        public void Transform(State state)
        {
            if (state == null)
            {
                return;
            }

            // Get the type of state.
            string stateType = state.GetType().Name;


            // WELCOME TabItem 
            if (state.CurrentState == State.WELCOME)
            {
                state.ChangeState(state.Machine, new WelcomeState(state)); 
            }

            //EMR_CONFIGURATION TabItem
            if (state.CurrentState == State.EMR_CONFIGURATION)
            {
                state.ChangeState(state.Machine, new EMRConfigurationState(state)); 
            }

            //MIGRATION TabItem 
            if (state.CurrentState == State.EMR_CONFIGURATION)
            {
                state.ChangeState(state.Machine, new MigrationState(state));
            }

        }
    }

  public class WelcomeState : State
    {
        public WelcomeState(State state) : base(state)
  {
        }

        public WelcomeState (Machine machine, string strCurrentState,string strPreviousState,string strNextState):
            base(machine, strCurrentState, strPreviousState, strNextState)
            {
            }


        public override void SetParams()
  {
            this.CurrentState  = State.WELCOME;
            this.PreviousState = State.WELCOME;
            this.NextState     = State.EMR_CONFIGURATION;
  }
    }

 public class EMRConfigurationState : State
    {
        public EMRConfigurationState(State state) : base(state)
  {
        }

        public EMRConfigurationState(Machine machine, string strCurrentState, string strPreviousState, string strNextState) :
            base(machine, strCurrentState, strPreviousState, strNextState)
            {
            }

        public override void SetParams()
  {
            this.CurrentState  = State.EMR_CONFIGURATION;
            this.PreviousState = State.WELCOME;
            this.NextState     = State.MIGRATION;  
  }
    }

 public class MigrationState: State
    {
        public MigrationState(State state) : base(state)
  {
        }

        public MigrationState(Machine machine, string strCurrentState, string strPreviousState, string strNextState) :
            base(machine, strCurrentState, strPreviousState, strNextState)
            {
            }

        public override void SetParams()
  {
            this.CurrentState  = State.MIGRATION;
            this.PreviousState = State.EMR_CONFIGURATION;
            this.NextState     = State.END_OF_STATES;
  }
    }


 public partial class Window1 : Window
    {
        private WizardPresenter wizPresenterWelcome = null;
        public List<WizardPresenter> stateList;
        public Window1()
        {
            InitializeComponent();

            stateList = new List<WizardPresenter>
                                        {
                                            new WizardPresenter(StatePresenter.WELCOME,
                                                StatePresenter.WELCOME,
                                                StatePresenter.EMR_CONFIGURATION),

                                            new WizardPresenter(StatePresenter.EMR_CONFIGURATION,
                                                StatePresenter.WELCOME,StatePresenter.MIGRATION),

                                            new WizardPresenter(StatePresenter.MIGRATION,
                                                StatePresenter.EMR_CONFIGURATION,
                                                StatePresenter.WELCOME),
                                        };

            tabControl.ItemsSource = stateList;
        }

        private WizardPresenter GetWizardPresenter(string strState)
        {
            foreach (WizardPresenter presenter in stateList)
            {
                if (presenter.currentStatePresenter.CurrentStatePresenter == strState)
                {
                    return presenter;
                    break;
                }
            }
            return null;
        }

        private void button_Click(object sender, RoutedEventArgs e)
        {
            if (this.wizPresenterWelcome == null)
            {
                try
                {
                    {
                        WizardPresenter wp = (WizardPresenter)tabControl.SelectedItem;
                        string nextState = wp.currentStatePresenter.NextStatePresenter;

                        tabControl.SelectedIndex = stateList.IndexOf(GetWizardPresenter(nextState));
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Error:" + ex.Message + "Error");
                }
            }
        }
    }
4

2 回答 2

1

如果你运行时它工作,那么你做对了,如果你运行它不起作用,那么你就错了。

于 2009-10-14T08:06:35.290 回答
0

一般来说:

  1. 当您改写问题时,请编辑原始帖子并在那里添加解释。
  2. 您可以创建一个包含所有相关状态以及当前、上一个和下一个状态的上下文类。每个状态都可以处理每个更改并根据以下条件决定下一个状态:

    • 上下文变量的运行时值。
    • 上下文的先前状态。
      等等
于 2013-05-07T06:34:17.273 回答