7

私はMVVM-Lightを使用しており、リレーコマンドが完全に機能しています。実装する必要があることを読みCanExecuteChangedましたCanExecute. 私は良い例を見つけることができませんが。

これらを実装する方法の良い例はありますか。

CanExecute は、実行できない場合に False を返す必要がありますが、ボタンを無効にするだけではありませんか??

いつ実行しCanExecuteChangedますか?

それぞれをいつ使用するかの良い例は誰にもありますが、私のコードはなくても機能しますが、このブログ投稿では、これらの項目を実装する必要があると述べています。

Enabledボタンや同様のコントロールを無効にできるように、プロパティまたは何かをViewModelのプロパティにバインドするだけだと思っていたので、少し混乱していますか?

理解の助けがあれば、本当に感謝しています。

編集

これは私が今持っているものです...動作していますが、ボタンが物理的に無効になっておらず、falseを返しているためコマンドが実行されません。RaiseCanExecuteChanged を強制的に実行するために、コンストラクターで CanExecuteMe を呼び出しています ...

これは、ビューモデルのコンストラクターで実行されます

        this.Page2Command = new RelayCommand(() => this.GoToPage2(), () => CanExecuteMe);

        CanExecuteMe = false;

これが私のコードの残りの部分です。例から取ったものです。

    private bool _canIncrement = true;

    public bool CanExecuteMe
    {
        get
        {
            return _canIncrement;
        }

        set
        {
            if (_canIncrement == value)
            {
                return;
            }

            _canIncrement = value;

            // Update bindings, no broadcast
            //RaisePropertyChanged(CanIncrementPropertyName);

            Page2Command.RaiseCanExecuteChanged();
        }
    }

    public RelayCommand Page2Command
    {
        get;
        private set;
    }

    private object GoToPage2()
    {
        System.Windows.MessageBox.Show("Navigate to Page 2!");
        return null;
    }

そして、ここに私のXAMLがあります

  <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="31,77,0,0" x:Name="button1" VerticalAlignment="Top" Width="75" >
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="Click">
                    <GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding Page2Command, Mode=OneWay}"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </Button>
4

2 に答える 2

10

CanExecute は、ボタンを有効にするかどうかを決定する必要があるときに呼び出されます。

Button はバインド時にこれを実行し、CanExecuteChanged が発生するたびに実行します (Button はコマンドのこのイベントをリッスンします)。

したがって、ボタンを無効にする必要がある場合は、CanExecuteChanged を起動し、ボタンが CanExecute を呼び出したときに を返す必要がありますfalse。これは、コマンド バインディングを使用するときにボタンを有効/無効にするための推奨される方法です。

コマンド バインディングを使用すると、すべてのボタン ロジックをインスタンス (コマンド) 内にカプセル化できます。CanExecute メソッドは、アプリケーションの現在の状態を照会して、ボタンを有効にするか無効にするかを決定する必要があります。このカプセル化により、View Model 内のスパゲッティ コードを減らすことができます。ここで、これらのチェックがあちこちで実行されますが、そこにあることを忘れていました。

于 2011-05-03T13:56:03.667 に答える
1

CanExecute 述語の使用には細心の注意を払う必要があります。すべての UI 変更と、任意のフィールドに入力されたすべてのキーボード キーをチェックします。

これにより、パフォーマンスの問題が発生する可能性があります。

于 2013-06-27T09:45:38.357 に答える