我在视图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");
}
}
答案 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属性,以便它以不同的文本返回不同的开始和停止命令: