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));
    }
}
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top