WPF Commands - делать это без кода - PullRequest
5 голосов
/ 09 октября 2009

Я создаю простое приложение для ввода данных в форме WPF, используя шаблон MVVM. Каждая форма имеет объект презентатора, который предоставляет все данные и т. Д. Я хотел бы использовать WPF-команды для включения и отключения кнопок «Изменить / Сохранить / Удалить» и параметров меню.

Моя проблема в том, что этот подход требует от меня добавления большого количества кода в код. Я пытаюсь сохранить свой уровень представления как можно более тонким, поэтому я бы предпочел, чтобы этот код / ​​логика был внутри моего класса докладчика (или ViewModel), а не внутри кода. Может кто-нибудь предложить способ достичь того же самого без кода позади?

Мой XAML выглядит примерно так:

<Window.CommandBindings>
    <CommandBinding 
        Command="ApplicationCommands.Save"
        CanExecute="CommandBinding_CanExecute"
        Executed="CommandBinding_Executed"
    />
</Window.CommandBindings>

и мой код выглядит примерно так:

private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
    e.CanExecute = (
        _presenter.SelectedStore != null &&
        _presenter.SelectedStore.IsValid);
}

Ответы [ 2 ]

11 голосов
/ 09 октября 2009

Шаблон проектирования Model-View-ViewModel (MVVM) направлен на достижение именно этой цели, а в замечательной статье Джоша Смита объясняется, как ее применять.

Для команд вы можете использовать класс RelayCommand, описанный в статье.

Поскольку у вас уже есть объект презентатора, вы можете позволить этому классу предоставить свойство ICommand, которое реализует желаемую логику, а затем связать XAML с этой командой. Это все объясняется в статье.

0 голосов
/ 28 марта 2016

Если вы специально пытаетесь связать команду в ViewModel с одной из команд приложения в XAML, вы должны создать инфраструктуру для этого самостоятельно. Я иду, хотя и делаю это в этом ответе , что позволяет вам сделать что-то вроде этого:

<local:RoutedCommandHandlers.Commands>
  <local:RoutedCommandHandler RoutedCommand="ApplicationCommands.Save" 
                              Command="{Binding TheSaveCommand}" />
</local:RoutedCommandHandlers.Commands>
...