WPF の ViewModelBase コマンド バインディング ボタンが無効になる問題を解決します
問題の説明: WPF ボタンを ViewModelBase クラスで定義されたコマンドにバインドすると失敗し、ボタンが応答しなくなる場合があります。
解決策:
問題は ViewModelBase の実装とボタン バインディングの構文にあります。これは完全な WPF ソリューションと実際の例です:
ボタンの XAML タグ:
XAML コードのこの部分が欠落しているため、完全な例を提供できません。 <Button>
要素とその Command
属性バインディングを指定する必要があります。例:
<code class="language-xml"><Button Content="Click Me" Command="{Binding ClickCommand}" /></code>
ウィンドウのコードビハインド:
<code class="language-csharp">public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); DataContext = new ViewModelBase(); } }</code>
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>
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>
使用例:
特定のシナリオでは、ビューのコンストラクターで DataInitializationCommand
の新しいインスタンスとして CommandHandler
をインスタンス化する必要があります。
<code class="language-csharp">public AttributeView() { InitializeComponent(); // 添加初始化组件 DataInitialization = new CommandHandler(DataInitializationAction, CanExecuteReinitialize); }</code>
がボタンをクリックしたときに実行するメソッドであることを確認し、DataInitializationAction
実行時にコマンドを有効にするか無効にするかを確認します。 UI が ViewModel の変更に応答できるように、忘れずに CanExecuteReinitialize
に ViewModelBase
インターフェイスを実装し、プロパティ変更イベントを正しく発生させてください。 INotifyPropertyChanged
、System.Windows.Input
、System.ComponentModel
などの必要な using ステートメントを追加する必要があることに注意してください。 また、System.Runtime.CompilerServices
は、XAML でボタンの ClickCommand
属性に正しくバインドされる必要があります。 欠落している XAML コードはこの例の重要な部分であり、実行する前に完了する必要があります。 Command
以上がViewModelBase コマンドにバインドされた WPF ボタンが機能しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。