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

StackOverflow https://stackoverflow.com/questions/805838

Вопрос

Следующий пример RoutedCommand работает.

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

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

Как я могу переместить обработчик команд из кода View в 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}"/>

Манажекустомерсвиев.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));
}

Команды.cs:

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

namespace TestDynamicForm123
{
    public class Commands
    {
        public static RoutedCommand SaveCustomer = 
             new RoutedCommand("SaveCustomer", typeof(ManageCustomersView));
    }
}
Это было полезно?

Решение

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

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

Затем в XAML

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

Однако вам может быть проще использовать Релейная команда так что вы также можете определить фактическую логику команд в вашей модели.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top