Heim >Backend-Entwicklung >C++ >Warum funktioniert meine an einen ViewModelBase-Befehl gebundene WPF-Schaltfläche nicht?

Warum funktioniert meine an einen ViewModelBase-Befehl gebundene WPF-Schaltfläche nicht?

Susan Sarandon
Susan SarandonOriginal
2025-01-12 20:41:43705Durchsuche

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

Lösen Sie das Problem, dass die ViewModelBase-Befehlsbindungsschaltfläche in WPF ungültig ist

Problembeschreibung: Das Binden einer WPF-Schaltfläche an einen in der ViewModelBase-Klasse definierten Befehl schlägt möglicherweise fehl und führt dazu, dass die Schaltfläche nicht mehr reagiert.

Lösung:

Das Problem liegt in der Implementierung von ViewModelBase und der Syntax der Schaltflächenbindung. Hier ist eine vollständige WPF-Lösung und ein funktionierendes Beispiel:

XAML-Tag für Schaltfläche:

Dieser Teil des XAML-Codes fehlt und ein vollständiges Beispiel kann nicht bereitgestellt werden. Sie müssen das <Button>-Element und seine Command-Attributbindung bereitstellen, zum Beispiel:

<code class="language-xml"><Button Content="Click Me" Command="{Binding ClickCommand}" /></code>

Code-Behind für Fenster:

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

ViewModelBase-Klasse:

<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>

CommandHandler-Klasse:

<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>

Verwendungsbeispiel:

In Ihrem spezifischen Szenario sollten Sie DataInitializationCommand als neue Instanz von CommandHandler im Konstruktor der Ansicht instanziieren:

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

Stellen Sie in diesem Beispiel sicher, dass DataInitializationAction die Methode ist, die Sie ausführen möchten, wenn auf die Schaltfläche geklickt wird. CanExecuteReinitializeÜberprüfen Sie, ob der Befehl zur Laufzeit aktiviert oder deaktiviert werden soll. Denken Sie daran, die ViewModelBase-Schnittstelle in INotifyPropertyChanged zu implementieren und Eigenschaftsänderungsereignisse korrekt auszulösen, damit die Benutzeroberfläche auf Änderungen im ViewModel reagieren kann.

Bitte beachten Sie, dass für dieses Beispiel das Hinzufügen notwendiger Using-Anweisungen wie System.Windows.Input, System.ComponentModel, System.Runtime.CompilerServices erforderlich ist. Und das ClickCommand muss korrekt an das Command-Attribut der Schaltfläche in XAML gebunden sein. Der fehlende XAML-Code ist ein wichtiger Teil dieses Beispiels und muss vervollständigt werden, bevor es ausgeführt werden kann.

Das obige ist der detaillierte Inhalt vonWarum funktioniert meine an einen ViewModelBase-Befehl gebundene WPF-Schaltfläche nicht?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn