Как переместить обработчик RoutedCommand из View-codebehind в ViewModel?
-
03-07-2019 - |
Вопрос
Следующий пример 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}" />
Однако вам может быть проще использовать Релейная команда так что вы также можете определить фактическую логику команд в вашей модели.