2009-04-30 1 views
8

Работает следующий пример RoutedCommand.Как перенести мой обработчик RoutedCommand из View-codebehind в ViewModel?

Однако обращение к кнопке, которая выполняет команду , находится в кодировке вида. То, как я понимаю MVVM, это должно быть в ViewModel.

Однако, когда я перемещаю метод в ViewModel (и меняю его на общедоступный), я получаю сообщение об ошибке «ManagedCustomersView не содержит определения OnSave». Даже если я изменил второй параметр RoutedCommand на typeof (ManageCustomersViewModel), я получаю ту же ошибку.

Как переместить обработчик команд из View-codebehind в ViewModel?

ManageCustomersView.xaml:

<UserControl.CommandBindings> 
    <CommandBinding Command="local:Commands.SaveCustomer" Executed="OnSave"/> 
</UserControl.CommandBindings> 
... 
<Button Style="{StaticResource formButton}" 
    Content="Save" 
    Command="local:Commands.SaveCustomer" 
    CommandParameter="{Binding Id}"/> 

ManageCustomersView.xaml.cs:

private void OnSave(object sender 
        , System.Windows.Input.ExecutedRoutedEventArgs e) 
{ 
    int customerId = ((int)e.Parameter); 
    MessageBox.Show(String.Format 
     ("You clicked the save button for customer with id {0}.", customerId)); 
} 

Commands.cs:

using System.Windows.Input; 
using TestDynamicForm123.View; 

namespace TestDynamicForm123 
{ 
    public class Commands 
    { 
     public static RoutedCommand SaveCustomer = 
      new RoutedCommand("SaveCustomer", typeof(ManageCustomersView)); 
    } 
} 

ответ

8

Вы откроете объект с вашей ViewModel, который ссылается на команду.

class MyViewModel 
{ 
    public RoutedCommand SaveCmd{ get{ return Commands.SaveCustomer; } } 
} 

Затем в XAML

<Button Command="{Binding SaveCmd}" /> 

Однако вы можете найти его проще использовать RelayCommand, так что вы можете определить действительную командную логику в модели, а также.

+0

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

+0

Взгляните на RoutedCommand, который делает его намного проще. Вы можете вернуть новый RoutedCommand (p => MessageBox.Show («Сохранение.»)) Изнутри вашей модели представления. –

+0

Я думаю, что предыдущий комментатор означал RelayCommand. –

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