Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于主状态枚举的绑定子状态枚举_C#_Wpf_Xaml_Data Binding - Fatal编程技术网

C# 基于主状态枚举的绑定子状态枚举

C# 基于主状态枚举的绑定子状态枚举,c#,wpf,xaml,data-binding,C#,Wpf,Xaml,Data Binding,我试图基于主状态将标签值绑定到子状态枚举。每个主状态都有不同的子状态枚举,这就是为什么当主状态更改时,我需要将标签重新绑定到不同的子状态枚举。但我如何做到这一点是相应的XAML代码 这是包含3个状态枚举(1个主状态和2个子状态)的类 因此,当当前状态更改为校准时,我想绑定到子状态项校准跟踪状态,当当前状态更改为回家时,我想绑定到子状态项回家状态 这是我到目前为止的XAML代码: <Label> <Label.Content> <TextBlo

我试图基于主状态将标签值绑定到子状态枚举。每个主状态都有不同的子状态枚举,这就是为什么当主状态更改时,我需要将标签重新绑定到不同的子状态枚举。但我如何做到这一点是相应的XAML代码

这是包含3个状态枚举(1个主状态和2个子状态)的类

因此,当
当前状态
更改为
校准
时,我想绑定到子状态项
校准跟踪状态
,当
当前状态
更改为
回家
时,我想绑定到子状态项
回家状态

这是我到目前为止的XAML代码:

<Label>
    <Label.Content>
        <TextBlock>
            <TextBlock.Text>
                <MultiBinding StringFormat="{}{0} - {1}">
                    <Binding Path="motor.CurrentState"/>
                    <Binding Path="motor.xxx"/>
                </MultiBinding>
            </TextBlock.Text>
        </TextBlock>
    </Label.Content>
</Label>
当校准的主状态为
且校准的子状态为
SUB_STATE_C1

时,请按照以下步骤操作

  • 在ViewModel中创建名为“SubState”的字符串属性,并将其绑定到标签,如下所示

      private string _subState;    
      public string SubState    
      {
         get { return _subState; }
         set { _subState = value; OnPropertyChanged(); }
      }
    
              public List<STATE> States { get; set; }
              States = new List<STATE>
              {
                  STATE.IDLE,
                  STATE.CALIBRATE,
                  STATE.GO_HOME
              };
    
  • 更新xaml以绑定到子状态字符串属性

    <Label Content="{Binding SubState}" />
    
  • 下面是我的ViewModel的SetState方法

          public void SetState(object selectedState)
          {
              if(selectedState.ToString() == STATE.IDLE.ToString())
              {
                  SubState = CurrentState.ToString();
              }
              else if(selectedState.ToString() == STATE.CALIBRATE.ToString())
              {
                  SubState = CalibrateTrackState.ToString();
              }
              else
              {
                  SubState = HomeingState.ToString();
              }
          }
    
      class MainVM : INotifyPropertyChanged
          {
    
              public List<STATE> States { get; set; }
    
              private string _subState;
              public string SubState
              {
                  get { return _subState; }
                  set { _subState = value; OnPropertyChanged(); }
              }
    
              public MainVM()
              {
                  States = new List<STATE>
                  {
                      STATE.IDLE,
                      STATE.CALIBRATE,
                      STATE.GO_HOME
                  };
    
                  SubState = CurrentState.ToString();
              }
    
    
    
              public void SetState(object selectedState)
              {
                  if(selectedState.ToString() == STATE.IDLE.ToString())
                  {
                      SubState = CurrentState.ToString();
                  }
                  else if(selectedState.ToString() == STATE.CALIBRATE.ToString())
                  {
                      SubState = CalibrateTrackState.ToString();
                  }
                  else
                  {
                      SubState = HomeingState.ToString();
                  }
              }
    
              private STATE _currentState = STATE.IDLE;
              public STATE CurrentState
              {
                  get { return _currentState; }
                 set { _currentState = value; OnPropertyChanged("CurrentState"); }
             }
    
             private CALIBRATE_TRACK _calibrateTrackState = CALIBRATE_TRACK.SUB_STATE_C1;
              public CALIBRATE_TRACK CalibrateTrackState
              {
                  get { return _calibrateTrackState; }
                  set { _calibrateTrackState = value; OnPropertyChanged("CalibrateTrackState"); }
              }
    
              private HOMING _homeingState = HOMING.SUB_STATE_H1;
              public HOMING HomeingState
              {
                  get { return _homeingState; }
                  set { _homeingState = value; OnPropertyChanged("HomeingState"); }
              }
    
              protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
              {
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
              }
    
              public event PropertyChangedEventHandler PropertyChanged;
          }
    
  • 声明列表并绑定到组合框,并在ViewModel构造函数中初始化States List对象,如下所示

      private string _subState;    
      public string SubState    
      {
         get { return _subState; }
         set { _subState = value; OnPropertyChanged(); }
      }
    
              public List<STATE> States { get; set; }
              States = new List<STATE>
              {
                  STATE.IDLE,
                  STATE.CALIBRATE,
                  STATE.GO_HOME
              };
    
    公共列表状态{get;set;}
    国家=新名单
    {
    国家,闲置,
    STATE.CALIBRATE,
    州政府,回家吧
    };
    
  • 注意:-MainVM是我的ViewModel,我个人认为Motor类应该只包含数据成员,而不包含任何属性更改事件或与VM相关的其他事情。因此,我已将某些项从Motor类移动到ViewModel

    查看我的完整视图模型

          public void SetState(object selectedState)
          {
              if(selectedState.ToString() == STATE.IDLE.ToString())
              {
                  SubState = CurrentState.ToString();
              }
              else if(selectedState.ToString() == STATE.CALIBRATE.ToString())
              {
                  SubState = CalibrateTrackState.ToString();
              }
              else
              {
                  SubState = HomeingState.ToString();
              }
          }
    
      class MainVM : INotifyPropertyChanged
          {
    
              public List<STATE> States { get; set; }
    
              private string _subState;
              public string SubState
              {
                  get { return _subState; }
                  set { _subState = value; OnPropertyChanged(); }
              }
    
              public MainVM()
              {
                  States = new List<STATE>
                  {
                      STATE.IDLE,
                      STATE.CALIBRATE,
                      STATE.GO_HOME
                  };
    
                  SubState = CurrentState.ToString();
              }
    
    
    
              public void SetState(object selectedState)
              {
                  if(selectedState.ToString() == STATE.IDLE.ToString())
                  {
                      SubState = CurrentState.ToString();
                  }
                  else if(selectedState.ToString() == STATE.CALIBRATE.ToString())
                  {
                      SubState = CalibrateTrackState.ToString();
                  }
                  else
                  {
                      SubState = HomeingState.ToString();
                  }
              }
    
              private STATE _currentState = STATE.IDLE;
              public STATE CurrentState
              {
                  get { return _currentState; }
                 set { _currentState = value; OnPropertyChanged("CurrentState"); }
             }
    
             private CALIBRATE_TRACK _calibrateTrackState = CALIBRATE_TRACK.SUB_STATE_C1;
              public CALIBRATE_TRACK CalibrateTrackState
              {
                  get { return _calibrateTrackState; }
                  set { _calibrateTrackState = value; OnPropertyChanged("CalibrateTrackState"); }
              }
    
              private HOMING _homeingState = HOMING.SUB_STATE_H1;
              public HOMING HomeingState
              {
                  get { return _homeingState; }
                  set { _homeingState = value; OnPropertyChanged("HomeingState"); }
              }
    
              protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
              {
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
              }
    
              public event PropertyChangedEventHandler PropertyChanged;
          }
    
    class MainVM:INotifyPropertyChanged
    {
    公共列表状态{get;set;}
    私有字符串_子状态;
    公共字符串子状态
    {
    获取{return\u subState;}
    设置{u subState=value;OnPropertyChanged();}
    }
    公共MainVM()
    {
    国家=新名单
    {
    国家,闲置,
    STATE.CALIBRATE,
    州政府,回家吧
    };
    SubState=CurrentState.ToString();
    }
    公共无效设置状态(对象选择状态)
    {
    if(selectedState.ToString()==STATE.IDLE.ToString())
    {
    SubState=CurrentState.ToString();
    }
    else if(selectedState.ToString()==STATE.CALIBRATE.ToString())
    {
    SubState=calibuteTrackState.ToString();
    }
    其他的
    {
    SubState=HomeingState.ToString();
    }
    }
    私有状态_currentState=STATE.IDLE;
    公共状态当前状态
    {
    获取{return\u currentState;}
    设置{u currentState=value;OnPropertyChanged(“currentState”);}
    }
    专用校准轨道校准轨道状态=校准轨道子状态C1;
    公共校准\轨道校准跟踪状态
    {
    获取{return}
    设置{u calibrateTrackState=value;OnPropertyChanged(“calibrateTrackState”);}
    }
    私有归零状态=归零状态H1;
    公共归宿国
    {
    获取{return\u homeingState;}
    设置{u homeingState=value;OnPropertyChanged(“homeingState”);}
    }
    受保护的void OnPropertyChanged([CallerMemberName]字符串propertyName=”“)
    {
    PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(propertyName));
    }
    公共事件属性更改事件处理程序属性更改;
    }
    
    注意:-我粘贴了您可能不完全需要的代码,因为我不确定您是如何检查状态更改的,所以我假设一个组合框绑定到您的ViewModel对象,并且我创建了上面提到的故事的其余部分

    希望我说得很清楚,如果您还有其他疑问,请不要犹豫再次询问。

    按照步骤进行操作

  • 在ViewModel中创建名为“SubState”的字符串属性,并将其绑定到标签,如下所示

      private string _subState;    
      public string SubState    
      {
         get { return _subState; }
         set { _subState = value; OnPropertyChanged(); }
      }
    
              public List<STATE> States { get; set; }
              States = new List<STATE>
              {
                  STATE.IDLE,
                  STATE.CALIBRATE,
                  STATE.GO_HOME
              };
    
  • 更新xaml以绑定到子状态字符串属性

    <Label Content="{Binding SubState}" />
    
  • 下面是我的ViewModel的SetState方法

          public void SetState(object selectedState)
          {
              if(selectedState.ToString() == STATE.IDLE.ToString())
              {
                  SubState = CurrentState.ToString();
              }
              else if(selectedState.ToString() == STATE.CALIBRATE.ToString())
              {
                  SubState = CalibrateTrackState.ToString();
              }
              else
              {
                  SubState = HomeingState.ToString();
              }
          }
    
      class MainVM : INotifyPropertyChanged
          {
    
              public List<STATE> States { get; set; }
    
              private string _subState;
              public string SubState
              {
                  get { return _subState; }
                  set { _subState = value; OnPropertyChanged(); }
              }
    
              public MainVM()
              {
                  States = new List<STATE>
                  {
                      STATE.IDLE,
                      STATE.CALIBRATE,
                      STATE.GO_HOME
                  };
    
                  SubState = CurrentState.ToString();
              }
    
    
    
              public void SetState(object selectedState)
              {
                  if(selectedState.ToString() == STATE.IDLE.ToString())
                  {
                      SubState = CurrentState.ToString();
                  }
                  else if(selectedState.ToString() == STATE.CALIBRATE.ToString())
                  {
                      SubState = CalibrateTrackState.ToString();
                  }
                  else
                  {
                      SubState = HomeingState.ToString();
                  }
              }
    
              private STATE _currentState = STATE.IDLE;
              public STATE CurrentState
              {
                  get { return _currentState; }
                 set { _currentState = value; OnPropertyChanged("CurrentState"); }
             }
    
             private CALIBRATE_TRACK _calibrateTrackState = CALIBRATE_TRACK.SUB_STATE_C1;
              public CALIBRATE_TRACK CalibrateTrackState
              {
                  get { return _calibrateTrackState; }
                  set { _calibrateTrackState = value; OnPropertyChanged("CalibrateTrackState"); }
              }
    
              private HOMING _homeingState = HOMING.SUB_STATE_H1;
              public HOMING HomeingState
              {
                  get { return _homeingState; }
                  set { _homeingState = value; OnPropertyChanged("HomeingState"); }
              }
    
              protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
              {
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
              }
    
              public event PropertyChangedEventHandler PropertyChanged;
          }
    
  • 声明列表并绑定到组合框,并在ViewModel构造函数中初始化States List对象,如下所示

      private string _subState;    
      public string SubState    
      {
         get { return _subState; }
         set { _subState = value; OnPropertyChanged(); }
      }
    
              public List<STATE> States { get; set; }
              States = new List<STATE>
              {
                  STATE.IDLE,
                  STATE.CALIBRATE,
                  STATE.GO_HOME
              };
    
    公共列表状态{get;set;}
    国家=新名单
    {
    国家,闲置,
    STATE.CALIBRATE,
    州政府,回家吧
    };
    
  • 注意:-MainVM是我的ViewModel,我个人认为Motor类应该只包含数据成员,而不包含任何属性更改事件或与VM相关的其他事情。因此,我已将某些项从Motor类移动到ViewModel

    查看我的完整视图模型

          public void SetState(object selectedState)
          {
              if(selectedState.ToString() == STATE.IDLE.ToString())
              {
                  SubState = CurrentState.ToString();
              }
              else if(selectedState.ToString() == STATE.CALIBRATE.ToString())
              {
                  SubState = CalibrateTrackState.ToString();
              }
              else
              {
                  SubState = HomeingState.ToString();
              }
          }
    
      class MainVM : INotifyPropertyChanged
          {
    
              public List<STATE> States { get; set; }
    
              private string _subState;
              public string SubState
              {
                  get { return _subState; }
                  set { _subState = value; OnPropertyChanged(); }
              }
    
              public MainVM()
              {
                  States = new List<STATE>
                  {
                      STATE.IDLE,
                      STATE.CALIBRATE,
                      STATE.GO_HOME
                  };
    
                  SubState = CurrentState.ToString();
              }
    
    
    
              public void SetState(object selectedState)
              {
                  if(selectedState.ToString() == STATE.IDLE.ToString())
                  {
                      SubState = CurrentState.ToString();
                  }
                  else if(selectedState.ToString() == STATE.CALIBRATE.ToString())
                  {
                      SubState = CalibrateTrackState.ToString();
                  }
                  else
                  {
                      SubState = HomeingState.ToString();
                  }
              }
    
              private STATE _currentState = STATE.IDLE;
              public STATE CurrentState
              {
                  get { return _currentState; }
                 set { _currentState = value; OnPropertyChanged("CurrentState"); }
             }
    
             private CALIBRATE_TRACK _calibrateTrackState = CALIBRATE_TRACK.SUB_STATE_C1;
              public CALIBRATE_TRACK CalibrateTrackState
              {
                  get { return _calibrateTrackState; }
                  set { _calibrateTrackState = value; OnPropertyChanged("CalibrateTrackState"); }
              }
    
              private HOMING _homeingState = HOMING.SUB_STATE_H1;
              public HOMING HomeingState
              {
                  get { return _homeingState; }
                  set { _homeingState = value; OnPropertyChanged("HomeingState"); }
              }
    
              protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
              {
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
              }
    
              public event PropertyChangedEventHandler PropertyChanged;
          }
    
    class MainVM:INotifyPropertyChanged
    {
    公共列表状态{get;set;}
    私有字符串_子状态;
    公共字符串子状态
    {
    获取{return\u subState;}
    设置{u subState=value;OnPropertyChanged();}
    }
    公共MainVM()
    {
    国家=新名单
    {
    国家,闲置,
    STATE.CALIBRATE,
    州政府,回家吧
    };
    SubState=CurrentState.ToString();
    }
    公共无效设置状态(对象选择状态)
    {
    if(selectedState.ToString()==STATE.IDLE.ToString())
    {
    SubState=CurrentState.ToString();
    }
    else if(selectedState.ToString()==STATE.CALIBRATE.ToString())
    {
    亚州=