3 votes

La liaison de commande ne fonctionne pas

Je suis en train de développer ma première application WPF pour l'université en utilisant MVVM. Je n'arrive pas à faire fonctionner cette liaison spécifique, bien que j'aie suivi les étapes utilisées précédemment qui ont été couronnées de succès.

J'ai le snippet xaml suivant :

    <Button Command="{Binding GetTicketsCommand}" Canvas.Left="50" Canvas.Top="202"    Content="Refresh List" Height="25" Width="137" />

La vue initialise la VM comme telle :

public JobListView()
    {
        InitializeComponent();
        viewModel = new JobListViewModel(this);
        this.DataContext = viewModel;
    }

Le modèle de vue contient une commande appelée GetTicketsCommand à laquelle le bouton est lié, mais lorsque je clique sur le bouton, les méthodes Execute ou CanExecute de la commande ne sont pas appelées. La commande que j'ai créée est instanciée dans le constructeur de la VM.

Des idées ?

Edit :

La classe de commande est comme ceci :

public class GetTicketsCommand  : ICommand
{
    private readonly JobListViewModel viewModel;

    public GetTicketsCommand(JobListViewModel viewModel)
    {
        this.viewModel = viewModel;     
    }

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public void Execute(object parameter)
    {
        viewModel.GetTickets();
    }

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }
}

Et dans le modèle de vue, je crée simplement une instance de celui-ci dans le constructeur :

public JobListViewModel()
    {
        GetTicketsCommand = new GetTicketsCommand(this);
        dataAccess = new DataLayerClient();
    }

9voto

BoltClock Points 249668

Les liaisons ne fonctionnent qu'avec les propriétés. Assurez-vous que votre GetTicketsCommand dans votre modèle de vue est une propriété :

public ICommand GetTicketsCommand { get; set; }

plutôt qu'un champ :

public ICommand GetTicketsCommand;

1voto

devdigital Points 22495

Pour les scénarios MVVM, une RelayCommand ou une DelegateCommand est plus adaptée que la RoutedCommand fournie avec WPF.

La commande DelegateCommand est fournie dans l'onglet Prisme et voir http://msdn.microsoft.com/en-us/magazine/dd419663.aspx pour plus de détails sur l'implémentation d'une RelayCommand (basée sur la DelegateCommand).

Le commandement a ses limites. Par exemple, un bouton sera désactivé si la commande indique qu'il ne peut pas être exécuté. Et si vous vouliez plutôt cacher le bouton ? Les commandes limitent votre marge de manœuvre pour réimaginer l'interface utilisateur.

Vous pouvez consulter Caliburn.Micro qui met en œuvre Actions . Ceux-ci vous permettent d'invoquer des verbes sur votre modèle de vue à partir d'événements par défaut du type de contrôle, le tout basé sur des conventions.

Par exemple, si vous avez un bouton sur votre vue avec un nom de Save alors le Save de votre modèle de vue sera invoquée lorsque le bouton sera cliqué. Aucune plomberie explicite n'est nécessaire. Vous disposez ensuite d'une plus grande flexibilité dans le comportement du bouton si la méthode de la vue est utilisée. CanSave sur votre modèle de vue retourne false.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X