Maison > développement back-end > C++ > Pourquoi mon bouton WPF lié à une commande ViewModelBase ne fonctionne-t-il pas ?

Pourquoi mon bouton WPF lié à une commande ViewModelBase ne fonctionne-t-il pas ?

Susan Sarandon
Libérer: 2025-01-12 20:41:43
original
702 Les gens l'ont consulté

Why Doesn't My WPF Button Bound to a ViewModelBase Command Work?

Résoudre le problème selon lequel le bouton de liaison de commande ViewModelBase dans WPF n'est pas valide

Description du problème : La liaison d'un bouton WPF à une commande définie dans la classe ViewModelBase peut échouer, empêchant le bouton de répondre.

Solution :

Le problème réside dans l'implémentation de ViewModelBase et la syntaxe de liaison des boutons. Voici une solution WPF complète et un exemple fonctionnel :

Balise XAML pour le bouton :

Cette partie du code XAML est manquante et un exemple complet ne peut pas être fourni. Vous devez fournir l'élément <Button> et sa liaison d'attribut Command, par exemple :

<code class="language-xml"><Button Content="Click Me" Command="{Binding ClickCommand}" /></code>
Copier après la connexion

Code-behind pour la fenêtre :

<code class="language-csharp">public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new ViewModelBase();
    }
}</code>
Copier après la connexion

Classe ViewModelBase :

<code class="language-csharp">public class ViewModelBase : INotifyPropertyChanged // 添加INotifyPropertyChanged接口
{
    public event PropertyChangedEventHandler PropertyChanged;

    private ICommand _clickCommand;
    public ICommand ClickCommand
    {
        get
        {
            return _clickCommand ?? (_clickCommand = new CommandHandler(() => MyAction(), () => CanExecute));
        }
    }

    public bool CanExecute
    {
        get
        {
            // 检查命令是否可执行
            return true;
        }
    }

    public void MyAction()
    {
        // 按钮点击时执行的操作
        MessageBox.Show("Button Clicked!");
    }

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}</code>
Copier après la connexion

Classe CommandHandler :

<code class="language-csharp">public class CommandHandler : ICommand
{
    private Action _action;
    private Func<bool> _canExecute;

    public CommandHandler(Action action, Func<bool> canExecute)
    {
        _action = action;
        _canExecute = canExecute;
    }

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

    public bool CanExecute(object parameter)
    {
        return _canExecute?.Invoke() ?? false; //处理空值
    }

    public void Execute(object parameter)
    {
        _action?.Invoke(); //处理空值
    }
}</code>
Copier après la connexion

Exemple d'utilisation :

Dans votre scénario spécifique, vous devez instancier DataInitializationCommand en tant que nouvelle instance de CommandHandler dans le constructeur de la vue :

<code class="language-csharp">public AttributeView()
{
    InitializeComponent(); // 添加初始化组件
    DataInitialization = new CommandHandler(DataInitializationAction, CanExecuteReinitialize);
}</code>
Copier après la connexion

Dans cet exemple, assurez-vous que DataInitializationAction est la méthode que vous souhaitez exécuter lorsque vous cliquez sur le bouton, CanExecuteReinitializevérifiez si la commande doit être activée ou désactivée au moment de l'exécution. N'oubliez pas d'implémenter l'interface ViewModelBase dans INotifyPropertyChanged et de déclencher correctement les événements de modification de propriété afin que l'interface utilisateur puisse répondre aux modifications apportées au ViewModel.

Veuillez noter que cet exemple nécessite l'ajout des instructions using nécessaires, telles que System.Windows.Input, System.ComponentModel, System.Runtime.CompilerServices. Et le ClickCommand doit être correctement lié à l'attribut Command du bouton en XAML. Le code XAML manquant constitue une partie essentielle de cet exemple et doit être complété avant de pouvoir s'exécuter.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal