[WPF] MVVM 형태로 Key Down 체크

현재 DX MVVM을 사용하면서 KeyDown을 체크하는데 KeyUp은 잘되지만 KeyDown은 잘 안되네요.
혹시 MVVM 형태로 개발하시는 분들 중에 KeyDown이 잘되시는 분의 노하우를 부탁드립니다.

KeyDown Command를 가장 최상위 DevExpress 컨트롤에서 감지하도록 Behavior를 주었는데 감지가 되지 않고, KeyDown 이벤트를 다른 컨트롤에서 전혀 걸지 않았기 때문에 버블링-터널링으로 걸릴 문제도 없다고 봅니다. 그래서 전역 키보드 후킹을 생각했지만, 결국 바인딩 형식으로 못했을때 하는 차선책이라 생각되어 일단 여기에 질문 올립니다.

어느 컨트롤에 focus가 가있던지 KeyDown을 감지하는 가장 효과적인 MVVM 방식인 어떤 것일까요?

1개의 좋아요

@Vincent 일단 Behaivor 말고 그냥 이벤트를 연결해서 KeyDown 테스트 해보면 잘 호출되나요?

질문과는 상관없는 내용이지만

아무튼 저는 Behaivor만으로 이벤트를 사용하기가 너무 불편해서요.
대신 Command를 직접 만들어 사용합니다.

컨트롤에서 직접 DependencyProperty ICommand를 등록해서 Command를 동작시킨다면
이벤트 부분과 로직 부분을 나누기에도 좋고 구조적으로도 좋아합니다.

public class CustomControl : Control
{
    DependencyProperty.Register("KeyDownCommand", ...);
    
    void OnKeyDown(object sender, EventArgs e)
    {
        KeyDownCommand?.Execute(this);
    }
}

(외부에 있어서 소스코드를 정확히 못 썼네요… :joy: )

1개의 좋아요

아…문제가 그게 맞았는지 모르겠지만, DevExpress WPF MVVM 프레임워크에 KeyToCommand라는 클래스가 있는데, 여기서 Key를 WPF KeyGesture로 받고 있었는데 여기서 버그가 있었던거 같습니다. 조합해서 해야하는데 그냥 LeftCtrl 하나만 써놔서 안된듯합니다. 키조합이 아닌 순수 KeyDown 이벤트를 Command로 만들어서 바인딩하니까 잘됩니다.

저 또한 커맨드를 만들어 쓰는 방식을 좋아하지만, Command로 만들었을 경우 ViewModel로 View의 객체가 넘어올 여지가 있을 거 같은 Command의 경우에는 Behavior를 정의해서 엄격한 MVVM 형태로 하고 있습니다. 코드를 많이 만들어두는 것은 생산성이 떨어지는 것은 분명하나, MVVM이라는 것은 애초에 빠른 개발속도가 아닌 유지보수의 편리성에 초점을 둔 패턴이라서 선호하고 있습니다. ㅎㅎ

제가 WPF할 때 아직 부족한게 많은데 그 중하나가 UC를 여러개 정의해서 하나의 UC에 껴넣어서 바인딩하는 것인데 XAML적 바인딩 테크닉이 부족하여 아직 시도해 보지 못하고 있네요 ㅎㅎ 여유가 되면 저도 View의 기능별 파트를 잘라 UC로 따로따로 만들어서 바인딩하는 것도 시도해 봐야할 듯 합니다.

답변 감사드립니다.

3개의 좋아요