Accepted answer

ObservesCanExecuteChanged relies on INotifyPropertyChanged of the class containing the observed property.

This raises the event in case of a change and thus works

private bool _isEnabled = true;
public bool IsEnabled
    get { return _isEnabled; }
    set { SetProperty(ref _isEnabled, value); }

while this raises no event and does not work, as you observed:

public bool IsEnabled { get; set; }

I thought that AutoProperties and Properties were exactly the same

That's just plain wrong. An "AutoProperty" is a "Property", but that's it concerning the similarities. They may look alike from the outside of a class, but a property can just do anything, while an auto property is just a overly complicated field.

Related Query

More Query from same tag