ホームページ > バックエンド開発 > C++ > ViewModelBase コマンドにバインドされた WPF ボタンが機能しないのはなぜですか?

ViewModelBase コマンドにバインドされた WPF ボタンが機能しないのはなぜですか?

Susan Sarandon
リリース: 2025-01-12 20:41:43
オリジナル
702 人が閲覧しました

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

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 の変更に応答できるように、忘れずに CanExecuteReinitializeViewModelBase インターフェイスを実装し、プロパティ変更イベントを正しく発生させてください。 INotifyPropertyChanged

この例では、

System.Windows.InputSystem.ComponentModel などの必要な using ステートメントを追加する必要があることに注意してください。 また、System.Runtime.CompilerServices は、XAML でボタンの ClickCommand 属性に正しくバインドされる必要があります。 欠落している XAML コードはこの例の重要な部分であり、実行する前に完了する必要があります。 Command

以上がViewModelBase コマンドにバインドされた WPF ボタンが機能しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート