Your problem is in the
public System.Windows.Input.ICommand ClickCommand
{
get
{
return new DelegateCommand(....
basically every time that property gets evaluated you will have a new command being generated. So your command that you are bound to won't be the same one that you are changing the state of.
Change your implementation to create the command in advance and return the same one.
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; }}
In addition you will commonly see the pattern of creating the _clickCommand as a Lazy<ICommand>
so that it only gets created on first usage.