2009-04-30 17 views
8

El siguiente ejemplo de RoutedCommand funciona.¿Cómo mover mi controlador RoutedCommand de View-codebehind a ViewModel?

Sin embargo, el manejo para el botón que ejecuta el comando se encuentra en el código detrás de la vista. La forma en que entiendo MVVM, es debe estar en el modelo de vista.

Sin embargo, cuando muevo el método al ViewModel (y lo cambio a público), aparece el error "ManagedCustomersView no contiene una definición de OnSave". Incluso si cambio el segundo parámetro de RoutedCommand a typeof (ManageCustomersViewModel), obtengo el mismo error.

¿Cómo puedo mover el manejador de comandos del View-codebehind al 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)); 
    } 
} 

Respuesta

8

Expondrá una propiedad de su ViewModel que hace referencia al comando.

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

Luego, en el XAML

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

Sin embargo puede que le resulte más fácil utilizar el RelayCommand para que pueda definir la lógica de mando real en su modelo, así.

+0

hmm, agregué esos dos pedacitos de código y ahora al hacer clic en mi botón no hago nada. Puedo eliminar UserControl.CommandBindings o dejarlo, pero eso no tiene ningún efecto. Nada en Salida. ¿Qué más necesito cambiar? –

+0

Eche un vistazo a RoutedCommand, que lo hace mucho más fácil. Puede devolver un nuevo RoutedCommand (p => MessageBox.Show ("Saving.")) Todo desde su modelo de vista. –

+0

Creo que el comentario anterior significa RelayCommand. –

Cuestiones relacionadas