RelayCommand를 사용하는데 텍스트 박스에 입력이 될때 length가 0보다 크면 버튼을 활성화하려고 합니다.
그럼 버튼design코드에 버튼 command parameter에 textbox 객체 넘겨주면 되는데 텍스트 박스의 길이가 변경되도 버튼 활성화가 되지 않아서 relaycommand를 살펴보고 있습니다.
아래는 RelayCommand인데 add => CommandManager.RequerySuggested += value;
이 부분의 연결고리가 어떻게 되는지 모르겠네요.
Relay Command(Action Execute,Function CanExecute) 생성하고
Design 에서 <Button command=“{Binding Execute}” commandparameter={binding tbxInputString}>
이렇게 하면 CommandManager.RequerySuggested += value 이 부분 value에 tbxInputString이 전달되는건지요?
public sealed class RelayCommand : IRelayCommand
{
readonly Action<object> _execute;
readonly Func<bool> _canExecute;
/// <summary>
/// Event occuring when encapsulated canExecute method is changed.
/// </summary>
public event EventHandler CanExecuteChanged
{
add => CommandManager.RequerySuggested += value;
remove => CommandManager.RequerySuggested -= value;
}
/// <summary>
/// Creates new instance of <see cref="RelayCommand"/>.
/// </summary>
/// <param name="execute">Action to be executed.</param>
public RelayCommand(Action execute) : this(execute, null)
{
// Delegated to RelayCommand(Action execute, Func<bool> canExecute)
}
}
먼저 Command는 MVVM일 때 유용합니다. MVVM이 아닐 경우 그냥 이벤트를 사용하면 됩니다.
CanExecuteChanged 이벤트가 발생하면 Command를 소비하는 컨트롤은 Command의 CanExecute()를 호출해서 명령어를 실행할 수 있는지를 확인합니다. 실행할 수 있거나/없는 상태일 경우 컨트롤을 활성화/비활성화 하도록 합니다.
그런데 명령어가 많을 때 이게 번거롭습니다. 그래서 CanExecuteCahgned이벤트는 CommandManager.RequerySuggested이벤트를 대신 사용하기도 합니다.
CommandManager.RequerySuggested이벤트는 CommandManager.InvalidateRequerySuggested() 명령어로 일괄 발생시킬 수 있습니다. 이를 통해 어떤 변화가 생겼을 때 명령어를 처리하는 모든 컨트롤에 일괄 활성화/비활성화 처리를 할 수 있습니다.
텍스트 박스의 입력이 있을 경우 일반적으로 텍스트박스에 값을 바인딩 하며 값이 변경되었을 때 CommandManager.InvalidateRequerySuggested()를 호출하도록 하면 원하는 동작을 할 것으로 보입니다.