CommandParameter를 받는 RelayCommand의 NotifyCanExecutechangedFor()를 설정하는 방법?

CommunityToolkit.Mvvm을 공부하고 있는데, 막히는 부분이 있어서 질문을 올립니다.

XAML에서 아래처럼 CommandParameter가 있는 버튼과 없는 버튼을 지정했습니다.

<Button Text="Button1" 
               Command="{Binding Button1Command}" />

<Button Text="Button2" 
               Command="{Binding Button2Command}" 
               CommandParameter="문자열" />

ViewModel에서 아래처럼 설정을했는데, NotifyCanExecuteChangedFor(Button2Command)부분에서 아래와 같은 에러가 납니다.
에러 : “Button2Command 이름이 현재 Context에 없습니다.”

CommandParameter를 받지 않는 RelayCommand는 에러가 나지 않는데, CommandParameter를 받는 RelayCommand만 NotifyCanExecuteChangedFor()로 지정하면 에러가 발생합니다.
에러를 해결하기 위한 방법이 있을까요?

[INotifyPropertyChanged]
public partial class Page1ViewModel
{
    [ObservableProperty]
    [NotifyCanExecuteChangedFor(nameof(Button2Command))]    // **<- 에러나는 부분**
    private string? name1;

    public Page1ViewModel() { }

    // Button 1 ------------------------------------------------------
    [RelayCommand]
    private void Button1()
    {
        // .......
    }


    // Button 2 ------------------------------------------------------
    [RelayCommand(CanExecute = nameof(CanButton2Execute))]
    private void Button2(string? name)
    {
        // ......
    }
    private bool CanButton2Execute(string? name)
    {
        // ......
        return true;
    }
}

툴킷을 잘 사용해보지 않아서 지나가는 말씀을 드리자면, nameof(Button2Command)를 찾을 수 없다는 오류가 표시된다면, generator에서 해당 field를 생성하지 않았을 확률이 높아보이니까 그거 한 번 체크해보시고, 파라미터를 넘긴다면, RelayCommand<object type> 형식으로 생성이 되어야 할거 같아요.

3개의 좋아요
public partial class MainViewModel : ObservableObject
{
    [ObservableProperty]
    [NotifyCanExecuteChangedFor(nameof(DoSomethingCommand))]
    private bool _isBusy = false;

    [ObservableProperty]
    [NotifyCanExecuteChangedFor(nameof(TitleCommand))]
    private string _title = string.Empty;

    public IRelayCommand<string> TitleCommand { get; } = new RelayCommand<string>((_) => { });


    [RelayCommand]
    private void DoSomething()
    {
    }
}

자동 생성되는 Command로는 파라미터가 포함된 Command가 생성 되지 않는 것 같습니다.
위 코드의 TitleCommand처럼 파라미터가 포함된 Command를 매핑해서 테스트 해 보시겠어요?

3개의 좋아요

좀더 테스트를 해 보니까 생성되는 Command로도 매핑 되는 것 같네요 ;;
버전 차이일까요?

public partial class MainViewModel : ObservableObject
{
    [ObservableProperty]
    [NotifyCanExecuteChangedFor(nameof(DoSomethingCommand))]
    private bool _isBusy = false;

    [ObservableProperty]
    [NotifyCanExecuteChangedFor(nameof(DoSomething2Command))]
    private string _title = string.Empty;

    public IRelayCommand<string> TitleCommand { get; } = new RelayCommand<string>((s) =>
    {
        MessageBox.Show("Hello world");
    }, CanTitle);

    private static bool CanTitle(string? str)
    {
        return string.Compare("Korea", str, StringComparison.OrdinalIgnoreCase) != 0;
    }

    [RelayCommand]
    private void DoSomething()
    {
        this.Title = "Korea";
    }
    

    [RelayCommand(CanExecute = nameof(CanSomething2))]
    private void DoSomething2(string str)
    {
        this.Title = str;
    }

    private bool CanSomething2(string str)
    {
        return string.Compare("Korea", str, StringComparison.OrdinalIgnoreCase) != 0;
    }
}
<ItemGroup>
  <PackageReference Include="CommunityToolkit.Mvvm" Version="8.0.0" />
</ItemGroup>

참고로 8.0.0 입니다.

2개의 좋아요