포스트

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 / MouseBindingBehavior + EventTrigger
MVVM 구조 지원
Command 바인딩
단축키 처리
마우스 클릭 구분(좌/우)
좌표/Key 정보 필요✅ (EventArgs 전달됨)
ViewModel에서 KeyEventArgs 접근
외부 패키지 필요✅ (Microsoft.Xaml.Behaviors.Wpf

마무리

  • 단순한 입력 처리 (단축키, 간단 클릭)는 KeyBinding, MouseBinding이면 충분
  • 이벤트 세부 정보가 필요하다면 Behavior를 써야 MVVM 유지하면서 처리 가능
  • 두 방법은 서로 대체제가 아니라 목적에 따라 병행 사용하는게 가장 좋음
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.