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개의 좋아요
nyjin
8월 8, 2022, 7:07오전
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개의 좋아요
nyjin
8월 8, 2022, 7:59오전
4
좀더 테스트를 해 보니까 생성되는 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개의 좋아요