Выполните шаги,
Создайте строковое свойство с именем «SubState» в вашей модели представления и привяжите его к метке, как показано ниже,
private string _subState;
public string SubState
{
get { return _subState; }
set { _subState = value; OnPropertyChanged(); }
}
Обновите свой xaml для привязки к свойству строки SubState.
<Label Content="{Binding SubState}" />
Предполагается, что у вас есть команда или событие для события изменения выбора, чтобы проверить, когда изменилось STATE и наобработчик событий, обновите текст «SubState», как показано ниже.
Примечание: - Для демонстрации я использую обработчик событий в коде для комбинированного списка, привязанного к списку
<ComboBox ItemsSource="{Binding States}" Grid.Row="0"
x:Name="CmbState" SelectionChanged="ComboBox_SelectionChanged">
</ComboBox>
Вот мой полный xaml
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<ComboBox ItemsSource="{Binding States}" Grid.Row="0" x:Name="CmbState" SelectionChanged="ComboBox_SelectionChanged">
</ComboBox>
<Label Content="{Binding SubState}" Grid.Row="1" />
</Grid>
Событие SelectionChanged при выделении кода
private void ComboBox_SelectionChanged(object sender,
SelectionChangedEventArgs e)
{
var cmbSender = sender as ComboBox;
var state = (Motor.STATE) cmbSender.SelectedItem;
mainVm.SetState(state);
}
ВотМетод SetState моей 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();
}
}
Объявление списка и привязка к вашему комбинированному списку и инициализация объекта списка состояний в конструкторе ViewModel, как показано ниже,
public List<STATE> States { get; set; }
States = new List<STATE>
{
STATE.IDLE,
STATE.CALIBRATE,
STATE.GO_HOME
};
Примечание: - MainVM - это моя ViewModel, и я лично считаю, что класс Motor должен содержать только элементы данных, а не какие-либо события, изменяющие свойства, или что-то еще, связанное с ВМ, которое необходимо сделать.Итак, я переместил некоторые элементы из класса Motor в свою ViewModel.
См. Мою полную ViewModel
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;
}
Примечание: - Я вставил код, который вам может не потребоваться полностью, так как яне знаю, как вы проверяете изменение STATE, поэтому я предположил привязку комбо-бокса к вашему объекту ViewModel и создал остальную часть истории, как указано выше.
Надеюсь, я дал понять, что если у вас естьлюбые другие сомнения, не стесняйтесь спрашивать снова.