1

ICommandインターフェイスのカスタム実装でRaiseCanExecuteChanged、外部から呼び出すことができるメソッドがあり、CanExecuteメソッドを呼び出して再評価し、コマンド(およびボタン)の状態を変更するという奇妙な動作を見つけました。

public void RaiseCanExecuteChanged()
{
  if (_canExecuteChanged != null)
    _canExecuteChanged(this, EventArgs.Empty);
}

ただし、イベントがプロパティとして実装された場合:

public event EventHandler CanExecuteChanged;

動かずCanExecuteChangedでしたnull

に変更した後、

private EventHandler _canExecuteChanged;
public event EventHandler CanExecuteChanged
{
  add { _canExecuteChanged += value; }
  remove { _canExecuteChanged -= value; }
}

できます。

コマンドはボタンCommandプロパティにバインドされます。

誰かが私にこれを説明できますか? ありがとうございました。

4

2 に答える 2

1

同様の問題に直面しました。多くの根本原因分析が見つかった後、MainPage.xaml ページで MainpageData コンテキストを 2 回初期化しました。2 番目の初期化は、ページのグリッド内で偶然行われました。CanExecuteChanged イベントが適切に初期化されない可能性があるため、これらの種類のエラーを確認してください。

于 2016-06-02T13:22:19.333 に答える
1

CanExecuteChangedプロパティ構文を使用する場合は、メソッドで次を使用する必要があります。

public void RaiseCanExecuteChanged()
{
    if (CanExecuteChanged != null)
        CanExecuteChanged(this, EventArgs.Empty);
}

さらに、_canExecuteChanged使用されないため、クラスから削除する必要があります。

ところで:RaiseCanExecuteChanged競合状態になりにくいため、次の実装の方が優れています。

public void RaiseCanExecuteChanged()
{
    var handler = CanExecuteChanged;
    if (handler != null)
        handler(this, EventArgs.Empty);
}
于 2012-10-15T10:01:25.233 に答える