WPF - обрабатывать ApplicationCommand в ViewModel - PullRequest
6 голосов
/ 24 февраля 2010

Бьюсь об заклад, на это уже много раз отвечали, но ...

Для простой ситуации, когда для кнопки в UserControl свойство команды имеет значение, аналогичное Find (ApplicationCommands.Find), как ViewModel будет обрабатывать эту команду? Я обычно вижу обработчики команд, связанные с CommandBinding, который добавляется в коллекцию CommandBindings на UIElement, но мой ViewModel не является производным от UIElement (не так ли?). Сами команды не отображают события, чтобы уведомлять о том, когда они были выполнены, так где я должен подключиться, чтобы получить эту информацию?

РЕДАКТИРОВАТЬ: Я хотел бы использовать стандартный WPF для решения проблемы, если это возможно. Я знаю, что есть много доступных фреймворков для такого рода вещей, но хотел бы сохранить код простым.

EDIT2: включая пример кода.

<UserControl>
  <UserControl.DataContext>
    <local:MyViewModel/>
  </UserControl.DataContext>

  <Button Command="Find"/>
</UserControl>

Где:

class MyViewModel
{
  // Handle commands from the view here.
}

Я мог бы добавить CommandBinding к UserControl, который будет обрабатывать Executed, а затем вызвать гипотетический метод Find в MyViewModel, который выполняет реальную работу, но это лишний и ненужный код. Я бы предпочел, чтобы сама ViewModel обрабатывала команду Find. Одним из возможных решений было бы получение MyViewModel из UIElement, однако это кажется противоречивым.

1 Ответ

4 голосов
/ 24 февраля 2010

Цель команд - отделить код, который генерирует порядок, от кода, который его выполняет. Поэтому: если вам нужна тесная связь, вам лучше сделать это через события:

<UserControl ... x:Class="myclass">
    ...
    <Button Click="myclass_find" .../>
    ...
</UserControl>

Для слабой связи необходимо добавить CommandBinding к вашему UserControl:

<UserControl ... >
    <UserControl.DataContext>
        <local:MyViewModel/>
    </UserControl.DataContext>

    <UserControl.CommandBindings>
        <Binding Path="myFindCommandBindingInMyViewModel"/>
    </UserControl.CommandBindings>
    ...
    <Button Command="ApplicationComamnd.Find" .../>
    ...
</UserControl>

(не уверен насчет синтаксиса)

Или вы можете добавить CommandBinding к вашим UserControl CommandBindings в конструкторе, взяв значение из ViewNodel:

partial class MyUserControl : UserControl
{
    public MyUSerControl()
    {
        InitializeComponent();
        CommandBinding findCommandBinding = 
                  ((MyViewModel)this.DataContext).myFindCommandBindingInMyViewModel;
        this.CommandBindings.Add(findCommandBinding);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...