WPF-MVVM 방식에 있어서 ICommand는 필수요소인 데 일반적으로 xaml의 Element(Button, TextBox 등)와 연결된 명령 동작의 이벤트를 처리한다. 우선 ICommand를 상속받은 RelayCommand 클래스를 만들고 ViewModel에서 이를 활용한다. 아래의 소스는 RelayCommand 클래스와 이를 활용한 이벤트 처리 예제이다.
<!-- <Fluent:Button Header="프로그램 종료" Command="{Binding TestCommand}" CommandParameter="{Binding ElementName=TestButton, Path=Header}" x:Name="TestButton"/> -->
<Fluent:Button Header="프로그램 종료" Command="{Binding TestCommand}" CommandParameter="{Binding RelativeSource={RelativeSource Self}}" x:Name="TestButton"/>
// ViewModel: Binding Path에 따라 object -> string
public ICommand TestCommand => new RelayCommand<object>(TestRun, TestCheck);
private void TestRun(object x)
{
MessageBox.Show((x as Button).Name);
}
private bool TestCheck(object x)
{
return x is Button;
}
RelayCommand Class
// RelayCommand.cs
using System;
using System.Windows.Input;
namespace MSJoTemplateWPF472.ViewModels
{
public class RelayCommand<T> : ICommand
{
readonly Action<T> _execute = null;
readonly Predicate<T> _canExecute = null;
public RelayCommand(Action<T> execute, Predicate<T> canExecute = null)
{
_execute = execute ?? throw new ArgumentNullException(nameof(execute));
_canExecute = canExecute;
}
public bool CanExecute(object parameter)
{
return _canExecute?.Invoke((T) parameter) ?? true;
}
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public void Execute(object parameter)
{
_execute((T) parameter);
}
}
}