How to enable a Button with its CanExecute method

Dante picture Dante · Jun 6, 2012 · Viewed 14k times · Source

I am developing an application in WPF using MVVM, but I am stuck with the ICommand objects.

I have a windows which contains some buttons, so, I bind them to their respective ICommand in XAML as below:

<Button Command="{Binding DoSomethingCommand}" Content="Do Something" />

Then, In my view-model class I have written the following:

public class MyViewModel : ObservableObject
{

    private bool isDoSomethingButtonEnabled = false;
    ....        
    public ICommand DoSomethingCommand
    {
        get;
        private set;
    }
    ....
    ....
    public MyViewModel()
    {
        DoSomethingCommand = new DelegateCommand<String>(this.OnDoSomething, this.CanDoSomething);
    }

    private void OnDoSomething(String arg)
    {

    }

    private bool CanDoSomething(String arg)
    {
        return isDoSomethingButtonEnabled;
    }
    ....
}

So, Since I need that my button is not enabled the first time the window opens, I set my variable isDoSomethingButtonEnabled to false. And it works, the button is disabled at the beginning, but my problem is that when I change the variable isDoSomethingButtonEnabled to true at run time my button is still disabled.

I have even done some tests after changing the variable isDoSomethingButtonEnabled to true, printing the result of DoSomethingCommand.CanExecute() and it shows "true"!

so, what Should I do in order to enable my button??

Thank you in advance

Answer

nemesv picture nemesv · Jun 6, 2012

There is an event called CanExecuteChanged on the ICommand interface which:

Occurs when changes occur that affect whether or not the command should execute.

With the Prism DelegateCommand you can raise this event with the RaiseCanExecuteChanged method:

public void SomeMethod()
{
    //do some work
    isDoSomethingButtonEnabled = true;
    DoSomethingCommand.RaiseCanExecuteChanged();
}