WPF MVVM 에서 KeyBinding vs Behavior 완전 비교
WPF MVVM 에서 KeyBinding vs Behavior 완전 비교
WPF 앱을 MVVM 구조로 개발할 때, 사용자 입력(키보드/마우스)을 ViewModel 에서 처리하려면 어떻게 해야 할까?
이번 포스팅에서는
KeyBinding / MouseBinding 만으로 가능한 작업과
EventArgs 를 받기 위해 반드시 Behavior 가 필요한 상황을 명확하게 비교해 보여드립니다.
1. KeyBinding & MouseBinding 만으로 가능한 것들
예제: Ctrl+S 누르면 저장
1
2
3
<Window.InputBindings>
<KeyBinding Gesture="Ctrl+S" Command="{Binding SaveCommand}" />
</Window.InputBindings>
ViewModel:
1
2
3
4
5
6
public ICommand SaveCommand => new RelayCommand(() => Save());
private void Save()
{
// 저장 로직
}
예제: 마우스 더블클릭
1
2
3
4
<Window.InputBindings>
<MouseBinding MouseAction="LeftDoubleClick"
Command="{Binding DoubleClickCommand}" />
</Window.InputBindings>
ViewModel:
1
2
3
4
public ICommand DoubleClickCommand => new RelayCommand(() =>
{
// 더블클릭 처리
});
간단한 입력 처리라면 이 방법이 가볍고 MVVM 에 적합합니다.
그런데 문제는 ?
KeyBinding 이나 MouseBinding 은 **이벤트 정보(EventArgs)를 받을 수 없습니다.
예를 들어:
- 어떤 키를 눌렀는지 알고 싶다.
- 마우스의 클릭 좌표가 필요하다.
- 마우스 우클릭인지 좌클릭인지 구분하고 싶다.
→ 불가능합니다.
2. Behavior를 써야할 때: 이벤트 인자 필요
이럴 땐 Microsoft.Xaml.Behaviors.Wpf
를 설치해서
EventTriggerBehavior
+ InvokeCommandAction
을 써야 해요.
1
Install-Package Microsoft.Xaml.Behaviors.Wpf
예제: Enter 키를 눌렀을 때만 처리
1
2
3
4
5
6
7
<TextBox>
<i:Interaction.Behaviors>
<ei:EventTriggerBehavior EventName="KeyDown">
<ei:InvokeCommandAction Command="{Binding KeyPressedCommand}" />
</ei:EventTriggerBehavior>
</i:Interaction.Behaviors>
</TextBox>
네임스페이스:
1
2
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
ViewModel:
1
2
3
4
5
6
7
public ICommand KeyPressedCommand => new RelayCommand<KeyEventArgs>(e =>
{
if (e.Key == Key.Enter)
{
// 엔터 입력 처리
}
});
예제: 마우스 클릭 좌표 알아내기
1
2
3
4
5
6
7
<Border Background="LightGray">
<i:Interaction.Behaviors>
<ei:EventTriggerBehavior EventName="MouseDown">
<ei:InvokeCommandAction Command="{Binding MouseClickedCommand}" />
</ei:EventTriggerBehavior>
</i:Interaction.Behaviors>
</Border>
1
2
3
4
5
public ICommand MouseClickedCommand => new RelayCommand<MouseButtonEventArgs>(e =>
{
Point point = e.GetPosition(null);
// 클릭 좌표 사용 가능
});
KeyBinding vs Behavior 비교 정리
항목 | KeyBinding / MouseBinding | Behavior + EventTrigger |
---|---|---|
MVVM 구조 지원 | ✅ | ✅ |
Command 바인딩 | ✅ | ✅ |
단축키 처리 | ✅ | ✅ |
마우스 클릭 구분(좌/우) | ❌ | ✅ |
좌표/Key 정보 필요 | ❌ | ✅ (EventArgs 전달됨) |
ViewModel에서 KeyEventArgs 접근 | ❌ | ✅ |
외부 패키지 필요 | ❌ | ✅ (Microsoft.Xaml.Behaviors.Wpf |
마무리
- 단순한 입력 처리 (단축키, 간단 클릭)는
KeyBinding
,MouseBinding
이면 충분 - 이벤트 세부 정보가 필요하다면 Behavior를 써야 MVVM 유지하면서 처리 가능
- 두 방법은 서로 대체제가 아니라 목적에 따라 병행 사용하는게 가장 좋음
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.