05.4 NotifyCanExecuteChanged
✅ 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