如何在xaml中使用ICommand更改按钮的标签?

时间:2013-10-29 07:29:18

标签: c# wpf xaml binding icommand

我在视图Home.xaml中有以下按钮。我把它绑定到一个名为StartStopLabel的属性。我在同一个视图中实现了接口ICommand,我可以在单击Start后将标签更改为文本“Stop”(这是我在视图的构造函数中设置的初始状态为{{ 1}},但是我无法做出将“按钮”的标签从“停止”更改为“开始”的反向。我的意思是当按钮时,this.StartStopLabel="Start",this.ButtonStatus="click on start button")没有通知点击事件标签显示“停止”。

一旦用户点击“停止”按钮(即按钮标签显示文本“停止”),我想将文本块“BtnSTatus”的文本更改为“您已点击开始按钮”并返回到“当按钮标签再次显示文本“开始”时,单击“开始”按钮。

有关如何解决这两个问题的任何建议吗?

我的观点:

ICommand

View.Cs代码:

<Button  Name="btnStartStop" Content="{Binding StartStopLabel}"  Command="{Binding ClickCommand}"  />
 <TextBlock Name="BtnStatus" Content="{Binding ButtonStatus}">

ClickCommand事件,它是View.cs中ICommand实现的一部分:

    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");
        }
    } 

2 个答案:

答案 0 :(得分: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>的模式,以便仅在首次使用时创建。

答案 1 :(得分:1)

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

  1. 使用“开始”命令初始化ClickCommand。
  2. 用户执行命令。
  3. 启动操作通过ICommand.Execute执行。
  4. ClickCommand更改为返回Stop命令。为ClickCommand引发OnPropertyChanged,以便UI绑定到新命令。
  5. 用户执行命令。
  6. 停止操作通过ICommand.Execute执行。
  7. ClickCommand已更改为返回“开始”命令。为ClickCommand引发OnPropertyChanged,以便UI绑定到新命令。 ...