0

我的视图 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}">

查看.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 事件是 View.cs 中 ICommand 实现的一部分:

  public System.Windows.Input.ICommand ClickCommand
    {
        get
        {
            return new DelegateCommand((o) =>
            {
                this.StartStopLabel = "Stop";
                Task.Factory.StartNew(() =>
                {
                    //call service on a background thread here...

                });
            });
        }
    }
4

2 回答 2

3

你的问题在

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>以便它仅在第一次使用时创建。

于 2013-10-29T07:52:12.947 回答
1

我建议更改 ClickCommand 属性,以便它使用不同的文本返回不同的启动和停止命令:

  1. ClickCommand 使用 Start 命令初始化。
  2. 用户执行命令。
  3. 启动操作通过 ICommand.Execute 执行。
  4. ClickCommand 更改为返回 Stop 命令。为 ClickCommand 引发 OnPropertyChanged,以便 UI 绑定到新命令。
  5. 用户执行命令。
  6. 停止动作通过 ICommand.Execute 执行。
  7. ClickCommand 更改为返回 Start 命令。为 ClickCommand 引发 OnPropertyChanged,以便 UI 绑定到新命令。...
于 2013-10-29T07:44:02.073 回答