WPF での ViewModelBase コマンド バインディングの問題を解決する
WPF では、基本クラス (ViewModelBase) で定義されたコマンドにボタンをバインドするのが難しい場合があります。この問題を解決する手順は次のとおりです:
1. データコンテキストを確立します
ビュー (AttributeView など) で、DataContext プロパティを ViewModelBase クラスのインスタンスに設定します。これにより、ビューと ViewModelBase の間にデータ バインディング コンテキストが確立されます。
2. コマンド属性
にバインドします。Binding タグ拡張機能を使用して、ボタンの Command プロパティを ViewModelBase の目的のコマンド プロパティにバインドします。例:
<code class="language-xml"><Button Command="{Binding DataInitialization}" /></code>
3. ViewModelBase でコマンド属性を定義します
ViewModelBase クラスで、DataInitialization プロパティを ICommand インターフェイスのインスタンスとして定義します。
<code class="language-csharp">public ICommand DataInitialization { get; protected set; }</code>
4. 初期化コマンドの属性
アプリケーションの起動時、または必要に応じて、DataInitialization コマンドのインスタンスを作成し、それを DataInitialization プロパティに割り当てます。例:
<code class="language-csharp">DataInitialization = new DataInitializationCommand();</code>
5. カスタム コマンド クラスを作成します
ICommand インターフェイスを実装するカスタム コマンド クラスを作成します。このクラスは、コマンドの実行と CanExecute ロジックを処理します。
6. 実行の処理と CanExecute
カスタム コマンド クラスで、Execute メソッドと CanExecute メソッドをオーバーライドして、コマンドに必要なロジックを実装します。
サンプルコード:
View (XAML): (XAML コード スニペットの例。元のコード スニペットは不完全なので直接使用できません)
<code class="language-xml"><Button Content="Initialize Data" Command="{Binding DataInitialization}" /></code>
ビューモデル:
<code class="language-csharp">public class ViewModelBase : INotifyPropertyChanged // 需要实现INotifyPropertyChanged接口 { private ICommand _dataInitializationCommand; public ICommand DataInitialization { get { return _dataInitializationCommand ?? (_dataInitializationCommand = new RelayCommand(DataInitializationAction, CanDataInitialization)); } } private bool CanDataInitialization(object parameter) { // 添加你的CanExecute逻辑 return true; } private void DataInitializationAction(object parameter) { // 添加你的Execute逻辑 } // ... INotifyPropertyChanged 实现 ... }</code>
RelayCommand (カスタム コマンド クラス):
<code class="language-csharp">public class RelayCommand : ICommand { private readonly Action<object> _execute; private readonly Predicate<object> _canExecute; public RelayCommand(Action<object> execute, Predicate<object> canExecute = null) { _execute = execute; _canExecute = canExecute; } public bool CanExecute(object parameter) => _canExecute == null || _canExecute(parameter); public event EventHandler CanExecuteChanged { add { CommandManager.RequerySuggested += value; } remove { CommandManager.RequerySuggested -= value; } } public void Execute(object parameter) => _execute(parameter); }</code>
これらの手順に従うことで、WPF のボタンを ViewModelBase クラスで定義されたコマンドに正常にバインドできます。 サンプル コードでは、欠落している INotifyPropertyChanged
インターフェイス実装を、より一般的に使用される RelayCommand
実装で補完し、より完全で実行可能になっていることに注意してください。 特定のニーズに合わせてコードを調整してください。
以上がWPF ボタン バインド: ボタンを ViewModelBase コマンドにバインドする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。