Como mover meu manipulador RoutedCommand de Ver-CodeBehind para ViewModel?
-
03-07-2019 - |
Pergunta
O seguinte exemplo funciona RoutedCommand.
No entanto, o tratamento para o botão que executa o comando está no codebehind da visão . A maneira como eu entendo MVVM, ele deve estar na ViewModel .
No entanto, Quando eu mover o método para o ViewModel (e alterá-lo ao público), eu recebo o erro " ManagedCustomersView não contém uma definição de OnSave ". Mesmo se eu alterar o segundo parâmetro RoutedCommand para typeof (ManageCustomersViewModel), eu recebo o mesmo erro.
Como posso mover o manipulador de comando do Ver-CodeBehind ao 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));
}
}
Solução
Você vai expor uma propriedade fora de seu ViewModel que as referências de comando.
class MyViewModel
{
public RoutedCommand SaveCmd{ get{ return Commands.SaveCustomer; } }
}
Em seguida, no XAML
<Button Command="{Binding SaveCmd}" />
No entanto, você pode achar que é mais fácil usar o RelayCommand para que você pode definir a lógica de comando real em seu modelo também.