Keyboard events in a WPF MVVM application?

前端 未结 8 1904
情深已故
情深已故 2020-11-27 11:30

How can I handle the Keyboard.KeyDown event without using code-behind? We are trying to use the MVVM pattern and avoid writing an event handler in code-behind file.

8条回答
  •  粉色の甜心
    2020-11-27 12:04

    WOW - there's like a thousand answers and here I'm going to add another one..

    The really obvious thing in a 'why-didn't-I-realise-this-forehead-slap' kind of way is that the code-behind and the ViewModel sit in the same room so-to-speak, so there is no reason why they're not allowed to have a conversation.

    If you think about it, the XAML is already intimately coupled to the ViewModel's API, so you might just as well go and make a dependency on it from the code behind.

    The other obvious rules to obey or ignore still applies (interfaces, null checks <-- especially if you use Blend...)

    I always make a property in the code-behind like this:

    private ViewModelClass ViewModel { get { return DataContext as ViewModelClass; } }
    

    This is the client-code. The null check is for helping control hosting as like in blend.

    void someEventHandler(object sender, KeyDownEventArgs e)
    {
        if (ViewModel == null) return;
        /* ... */
        ViewModel.HandleKeyDown(e);
    }
    

    Handle your event in the code behind like you want to (UI events are UI-centric so it's OK) and then have a method on the ViewModelClass that can respond to that event. The concerns are still seperated.

    ViewModelClass
    {
        public void HandleKeyDown(KeyEventArgs e) { /* ... */ }
    }
    

    All these other attached properties and voodoo is very cool and the techniques are really useful for some other things, but here you might get away with something simpler...

提交回复
热议问题