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