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!