✅ 5. 다양한 사용법

① 조건이 자주 바뀌는 경우 → NotifyCanExecuteChanged

[RelayCommand(CanExecute = nameof(CanSubmit))]
private void Submit() { }

private bool CanSubmit() => IsChecked && !string.IsNullOrEmpty(InputText);

private bool isChecked;
public bool IsChecked
{
    get => isChecked;
    set
    {
        SetProperty(ref isChecked, value);
        SubmitCommand.NotifyCanExecuteChanged();
    }
}

NotifyCanExecuteChanged()를 호출해야 버튼 활성화 상태가 즉시 갱신됩니다.


② ObservableProperty 변경에 따라 자동 갱신하는 방법

[CommunityToolkit 8.1+]에서는 이 방법도 가능해요:

[ObservableProperty]
[NotifyCanExecuteChangedFor(nameof(GreetCommand))]
private string userName;

UserName 속성이 바뀌면 자동으로 GreetCommand의 CanExecute 상태가 업데이트됩니다.


③ 비동기 작업 중 중복 클릭 방지 (AsyncRelayCommand + IsBusy)

[ObservableProperty]
[NotifyCanExecuteChangedFor(nameof(LoadDataCommand))]
private bool isBusy;

[RelayCommand(CanExecute = nameof(CanLoadData))]
private async Task LoadDataAsync()
{
    IsBusy = true;
    await Task.Delay(2000);
    IsBusy = false;
}

private bool CanLoadData() => !IsBusy;

IsBusy가 true이면 버튼 비활성화 → 작업 완료되면 다시 true → false