Используйте встроенные команды WPF с ViewModel - PullRequest
4 голосов
/ 28 января 2011

Хорошо, поэтому я пытаюсь понять концепцию команд WPF. Они кажутся довольно простыми, пока вы не попытаетесь перенаправить команду к чему-то, что не соответствует коду XAML. Я видел несколько способов сделать это с помощью пользовательских команд, но нет прямого объяснения того, как это сделать с помощью встроенных команд WPF. Такие вещи, как «Открыть», «Сохранить», «Вырезать» и т. Д.

Есть ли простой способ, используя класс RelayCommand или что-то еще, переслать команду Open в мою ViewModel?

Ответы [ 4 ]

6 голосов
/ 28 января 2011

Встроенные в WPF ApplicationCommands и т. П. Изначально не были разработаны с учетом MVVM, поэтому они не совпадают, когда вы пытаетесь поместить их в ViewModel.

В WPF 4 теперь можно привязать InputCommands к вашей ViewModel:

https://www.thomaslevesque.com/2009/10/26/vs2010-binding-support-in-inputbindings/

Альтернативой является использование DelegateCommands, которое вы можете реализовать самостоятельно.или получить из библиотеки, как Prism .Вы можете определить DelegateCommand как объект в вашей модели представления и связать его с вашим представлением.

После того, как вы установили привязку, вы определяете, что команда делает в вашем коде модели представления.

3 голосов
/ 28 января 2011

Если вы работаете с MVVM с WPF, я настоятельно рекомендую посмотреть на фреймворк, который поможет вам, например:

  1. Prism (предоставляет собственную DelegateCommand)
  2. MVVM Light Toolkit (предоставляет собственную RelayCommand)
  3. Caliburn.Micro (мой любимый, предоставляет действия)
1 голос
/ 28 января 2011

Одним из способов является использование присоединенного свойства, чтобы позволить вашей ViewModel определять CommandBindings на представлении.Проверьте мой блог для деталей:

CommandBindings с MVVM

0 голосов
/ 23 апреля 2014

Предположим, ваша ViewModel предоставляет новую команду.Вы можете перенаправить привязку команды Application.New к виртуальной машине с помощью следующего кода.В XAML:

<Window.CommandBindings>
    <CommandBinding Command="New" />
    ...
</Window.CommandBindings>

Тогда в коде вы можете сделать что-то вроде этого.(Мне нравится хранить код вне кода, поэтому я размещаю его в служебном классе.)

foreach (CommandBinding cb in CommandBindings)
{
    switch (((RoutedUICommand)cb.Command).Name)
    {
        case "New":
            cb.Executed += (sender, e) => ViewModel.New.Execute(e);
            cb.CanExecute += (sender, e) => e.CanExecute = ViewModel.New.CanExecute(e);
            break;
    }
}

Анонимные методы обеспечивают переход между RoutedUICommand и ICommand.

EDIT: В качестве альтернативы рекомендуется явно устанавливать привязку команды с помощью CommandManager, а не добавлять обработчики.

CommandManager.RegisterClassCommandBinding(typeof(MainWindow),
    new CommandBinding(ApplicationCommands.New,
        (sender, e) => ViewModel.NewScore.Execute(e),
        (sender, e) => e.CanExecute = ViewModel.NewScore.CanExecute(e)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...