2010-02-24 4 views
6

Держу пари, это было в течение ответил много раз, но ...WPF - обрабатывать ApplicationCommand в ViewModel

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

EDIT: Я бы хотел использовать WPF для решения проблемы, если это возможно. Я знаю, что для этого есть много доступных фреймворков, но хотелось бы, чтобы код был прост.

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

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

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

Где:

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

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

ответ

4

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

<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's CommandBindings в конструктор, взяв val ue из ViewNodel:

partial class MyUserControl : UserControl 
{ 
    public MyUSerControl() 
    { 
     InitializeComponent(); 
     CommandBinding findCommandBinding = 
        ((MyViewModel)this.DataContext).myFindCommandBindingInMyViewModel; 
     this.CommandBindings.Add(findCommandBinding); 
    } 
} 
+0

Я бы предпочел свободное соединение, поэтому я ищу ответ, который показывает, как обрабатывать команду в отдельном классе, отличном от UserControl. –

+0

Вы хотите обрабатывать 'ApplicationCommands.Find' одинаково для всех источников? – Vlad

+0

Добавлен некоторый код, чтобы уточнить, где я хочу обработать выполнение команды - я хотел бы обрабатывать команды в ViewModel, а не сам UserControl в соответствии с общей философией MVVM. –

Смежные вопросы