Как я могу изменить метку кнопки, используя 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, чтобы оно возвращало разные команды для запуска и остановки с разными текстами:

  1. ClickCommand инициализируется командой Пуск.
  2. Пользователь выполняет команду.
  3. Действия для запуска выполняются через ICommand.Execute.
  4. Команда ClickCommand изменяется для возврата команды Stop. OnPropertyChanged вызывается для ClickCommand, чтобы пользовательский интерфейс связывался с новой командой.
  5. Пользователь выполняет команду.
  6. Действия для остановки выполняются через ICommand.Execute.
  7. Команда ClickCommand изменяется для возврата команды "Пуск". OnPropertyChanged вызывается для ClickCommand, чтобы пользовательский интерфейс связывался с новой командой....
Другие вопросы по тегам