2009-10-14 7 views
0

Je souhaite implémenter une fonctionnalité qui donne la possibilité de basculer les tabItems (TabItem1, TabItem2, TabItem3), lorsque l'utilisateur clique sur le bouton "next" du formulaire. Et pour cette raison, j'aimerais utiliser State Machine Pattern.WPF et le modèle de machine d'état

Ces choses que j'ai déjà mis en œuvre, mais je n'ai aucune idée, est-il juste ou non ?:

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"); 
       } 
      } 
     } 
    } 
+0

sérieusement nous demander de patauger dans tout votre code avec une vague « ai-je bien? » est à peine une vraie question. – AnthonyWJones

+0

Je veux juste entendre votre opinion, ai-je raison de la logique ou non. J'ai mis tout mon code, pour vous donner la possibilité de le lancer au cas où vous seriez intéressé par ma question. Je ne suis pas assez expérimenté, c'est pourquoi je veux avoir le soutien de techniciens plus expérimentés ici. merci, Julian – julianusti

Répondre

1

Si lorsque vous exécutez cela fonctionne, alors vous l'avez droit, si lorsque vous exécutez ça ne marche pas, alors vous avez tort.

+0

Vous avez raison :) J'ai essayé et cela ne fonctionne pas, peut-être vous pouvez me donner une idée pourquoi? :)) merci. Julian – julianusti

+0

OK, que, laissez-moi reformuler ma question! Comment faire une machine d'état simple, ce qui me donne la possibilité de basculer entre Tabitems, lorsque l'utilisateur appuie sur le bouton Suivant? J'ai besoin de connaître currentState, previousState et nextState. Chaque état doit être Singletone. abstrait Etat de classe() { Etat (nom de chaîne) // nom de l'État {} } Machine classe() { } merci. – julianusti

0

En général:

  1. Lorsque vous reformulant une question, modifier le message original et ajouter des explications là-bas.
  2. Vous pouvez créer une classe de contexte contenant tous les états pertinents et les états actuel, précédent et suivant. Chaque état peut gérer chaque changement et décider de l'état suivant en fonction de:

    • Valeur d'exécution des variables de contexte.
    • L'état précédent du contexte.
      etc.
Questions connexes