Question

L'exemple de RoutedCommand suivant fonctionne.

Cependant, le traitement du bouton qui exécute la commande se trouve dans le code derrière la vue . Si je comprends bien MVVM, il devrait figurer dans le ViewModel .

Cependant, lorsque je déplace la méthode vers ViewModel (et le change en public), l'erreur "" ManagedCustomersView ne contient pas de définition de OnSave ". Même si je modifie le second paramètre RoutedCommand en typeof (ManageCustomersViewModel), la même erreur se produit.

Comment puis-je déplacer le gestionnaire de commandes du View-codebehind au 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));
}

Commandes.cs:

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

namespace TestDynamicForm123
{
    public class Commands
    {
        public static RoutedCommand SaveCustomer = 
             new RoutedCommand("SaveCustomer", typeof(ManageCustomersView));
    }
}
Était-ce utile?

La solution

Vous allez exposer une propriété de votre ViewModel qui fait référence à la commande.

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

Puis dans le XAML

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

Cependant, vous trouverez peut-être plus facile d'utiliser la RelayCommand pour que vous pouvez également définir la logique de commande réelle dans votre modèle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top