Сочетания клавиш в WPF направляются на ViewModel - PullRequest
0 голосов
/ 30 ноября 2011

Я хочу получать команды в моей ViewModel (т. Е. Не иметь никакого кода в поле зрения).У меня есть настройки KeyBindings в представлении, но я не уверен, как создать команду для модели представления, как мне это сделать?Я пробовал код ниже, но он никогда не вызывается.

Я получаю эту ошибку в окне вывода

Ошибка пути BindingExpression: свойство 'ShowHelp' не найдено в 'object' '' String '(HashCode = -1833871577)'.BindingExpression: Path = ShowHelp;DataItem = 'String' (HashCode = -1833871577);целевым элементом является KeyBinding (HashCode = 60325168);Свойство target - 'Command' (тип 'ICommand')

viewModel определяется следующим образом: (обратите внимание, это работает для всех других привязок в окне)

<app:ViewModel x:Key="viewModel"></app:ViewModel>

XAML:

<Window.InputBindings>
    <KeyBinding Command="{Binding ShowHelp, Source=viewModel}" Gesture="ALT+H" />
</Window.InputBindings>

Код ViewModel

Здесь я начал с кода ViewModel для выполнения команды, если это не так, пожалуйста, сообщите:)

public class ShowHelpCommand : ICommand
{
    public bool CanExecute(object parameter)
    {
        return true;
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
        Console.WriteLine("SHOW HELP");
    }
}
public ICommand ShowHelp { get;  set; }
ShowHelp = new ShowHelpCommand();

Ответы [ 2 ]

1 голос
/ 30 ноября 2011

Разве это не отсутствующий StaticResource?

<KeyBinding Command="{Binding ShowHelp, Source={StaticResource viewModel}}" Gesture="ALT+H" />
1 голос
/ 30 ноября 2011

Самый простой способ - использовать DelegateCommand , находящийся в библиотеке Microsoft Prism (http://msdn.microsoft.com/en-us/library/ff653940.aspx)

. Тогда ваш код будет выглядеть примерно так:

ShowHelp = new DelegateCommand<object>(param => MethodToExecute)
private void MethodToExecute(object param) {
    //...
}

ЕслиВы не хотите включать библиотеку Prism в свой проект, довольно легко развернуть собственную реализацию команды делегата, все, что вам нужно сделать, это реализовать интерфейс ICommand, передать и сохранить Action и Func и выполнить их в реализацииВыполнить и CanExecute.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...