Как я могу изменить метку кнопки, используя ICommand в xaml?
У меня есть следующая кнопка в моем представлении Home.xaml. У меня есть привязка к свойству под названием StartStopLabel. Я реализовал интерфейс ICommand
в том же виде, и я мог изменить метку на текст "Стоп" после нажатия на кнопку "Пуск" (это исходный статус, который я устанавливаю в конструкторе представления как this.StartStopLabel="Start",this.ButtonStatus="click on start button")
, но я не могу сделать обратное, чтобы изменить метку кнопки с "Стоп" на "Старт". Что я хочу сказать, это ICommand
не уведомляется о событии щелчка, когда метка кнопки показывает "Стоп".
Когда пользователь нажимает кнопку "Стоп" (т. Е. Когда на кнопке отображается текст "Стоп"), я хочу изменить текст текстового блока "BtnSTatus" на "Вы нажали кнопку пуска" и вернуться к "Нажмите на Пуск". кнопка ", когда метка кнопки снова показывает текст" Пуск ".
Любые предложения, как исправить эти две проблемы?
Мой взгляд:
<Button Name="btnStartStop" Content="{Binding StartStopLabel}" Command="{Binding ClickCommand}" />
<TextBlock Name="BtnStatus" Content="{Binding ButtonStatus}">
View.Cs код:
private string _startStopLabel;
public string StartStopLabel
{
get
{
return _startStopLabel;
}
set
{
_startStopLabel = value;
RaisePropertyChanged("StartStopLabel");
}
}
private string _ButtonStatus;
public string ButtonStatus
{
get
{
return _ButtonStatus;
}
set
{
_ButtonStatus = value;
RaisePropertyChanged("ButtonStatus");
}
}
Событие ClickCommand, которое является частью реализации ICommand в View.cs:
public System.Windows.Input.ICommand ClickCommand
{
get
{
return new DelegateCommand((o) =>
{
this.StartStopLabel = "Stop";
Task.Factory.StartNew(() =>
{
//call service on a background thread here...
});
});
}
}
2 ответа
Ваша проблема в
public System.Windows.Input.ICommand ClickCommand
{
get
{
return new DelegateCommand(....
в основном каждый раз, когда это свойство оценивается, у вас будет генерироваться новая команда. Таким образом, ваша команда, которой вы обязаны, не будет той же самой, в которой вы меняете состояние.
Измените вашу реализацию, чтобы заранее создать команду и вернуть ту же.
private System.Windows.Input.ICommand _clickCommand = new DelegateCommand((o) =>
{
this.StartStopLabel = "Stop";
Task.Factory.StartNew(() =>
{
//call service on a background thread here...
});
});
public System.Windows.Input.ICommand ClickCommand { get { return _clickCommand; }}
Кроме того, вы обычно увидите шаблон создания _clickCommand как Lazy<ICommand>
так что он создается только при первом использовании.
Я бы предложил изменить свойство ClickCommand, чтобы оно возвращало разные команды для запуска и остановки с разными текстами:
- ClickCommand инициализируется командой Пуск.
- Пользователь выполняет команду.
- Действия для запуска выполняются через ICommand.Execute.
- Команда ClickCommand изменяется для возврата команды Stop. OnPropertyChanged вызывается для ClickCommand, чтобы пользовательский интерфейс связывался с новой командой.
- Пользователь выполняет команду.
- Действия для остановки выполняются через ICommand.Execute.
- Команда ClickCommand изменяется для возврата команды "Пуск". OnPropertyChanged вызывается для ClickCommand, чтобы пользовательский интерфейс связывался с новой командой....