Why is a button enabled if the Command binding resolves to null?

c#, mvvm, wpf

Solution

It is enabled because that's the default state. Disabling it automatically would be an arbitrary measure that gives rise to other problems.

If you want to have a button without an associated command be disabled, bind the `IsEnabled` property to `SomeCommand` using an appropriate converter, e.g.:

[ValueConversion(typeof(object), typeof(bool))]
public class NullToBooleanConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value !== null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

Problem

OK, the XAML is quite simple and uses MVVM to bind to an `ICommand SomeCommand { get; }` property on a view model: ``` <Button Command="{Binding Path=SomeCommand}">Something</Button> ``` If `SomeCommand` returns `null`, the button is enabled. (Nothing to do with `CanExecute(object param)` method on `ICommand`, because there is no instance to call that method on) And now the question: Why is the button enabled? How would you work it around? If you press the "enabled" button, obviously nothing is called. It is just ugly that the button looks enabled.

Original source