RelayCommand CanExecute 연결고리가 어떻게 되는지요?

@핸썸가이 좋은 질문 주셔서 감사합니다.
저도 답변 읽어보면서 많이 도움 되었네요.

그리고 잘 해결 하셨으니! 질문과는 벗어나는 내용이지만 저는 CommunityToolkit.Mvvm을 통해 구현하는 방법에 대해서도 간략하게 남겨두겠습니다.

만약 이 라이브러리를 통한 Command 구현을 필요로 하시는 분들에게는 유용할 것입니다. :smile:
(모든 상황에서 만능은 아니지만 지금 같은 상황에서는 아주 심플하고 간단하게 처리할 수 있습니다.)


xaml은 크게 다른게 없네요.

<StackPanel>
    <TextBox Text="{Binding Keywords, UpdateSourceTrigger=PropertyChanged}"/>
    <Button Content="Save" Command="{Binding SaveCommand}"/>
</StackPanel>

ViewModel에서는 CommunityToolkit.Mvvm 라이브러리에서 제공하는 기술 총 동원~
(각각의 어트리뷰트를 유심히 추척해보면 됩니다.)

using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;

namespace JamesCommand
{
    public partial class MyViewModel : ObservableObject
    {
        [ObservableProperty]
        [NotifyCanExecuteChangedFor(nameof(SaveCommand))]
        private string _keywords;

        private bool CanSave(object o)
        {
            return !string.IsNullOrWhiteSpace(Keywords) && Keywords.Length > 0;
        }

        [RelayCommand(CanExecute = nameof(CanSave))]
        private void Save(object o)
        {
            // Save.
        }
    }
}

결과

CanSave false

image

CanSave true

image

여기까지 입니다~
읽어주셔서 감사합니다. :smile:

4개의 좋아요