ここで関連する質問があります。ここでは、コマンド バインディングを使用したユーザー コントロールがあります。ユーザー コントロールはビジュアル ツリーから削除されていますが、canExecute はまだ起動しています。コマンディング モデルについての私の理解では、ルーティング イベントのようにバブリングしてトンネリングするというものでした。では、コマンド バインディングがアタッチされた要素がビジュアル ツリーに存在しなくなったら、どのように CanExecute を起動できるでしょうか。
2 に答える
IMO、CommandBindings は WPF での実装が本当に不十分です。コントロールが閉じられている場合でも、システムが CommandBinding を持っている場合、システムがコントロールへの WeakReference を保持するという事実を回避する必要があります。
XAML コードで CommandBinding を設定する方法については、オンラインで多くの例を参照できます。問題は、これらすべての例が貼り付けられたアプリにパフォーマンスの問題をもたらすことです。CommandBindings が単独で適切になくなることはありません。少なくとも、長い間ではありません。
解決策は次のとおりです。
A) XAML で CommandBindings を設定しないでください。コードビハインドを使用する必要があります。InitializeComponent() を呼び出した後にコンストラクターを使用することをお勧めします。this.CommandBindings.Add() を使用して、CommandBindings をコードで追加します。
B) Window または Control の Closed() イベントを処理し、this.CommandBindings.Clear() を呼び出します。
これは、CommandBindings の起動を確実に終了させることができた唯一の方法です。この機能が Microsoft によって実装されたのはばかげていると思います。XAML で CommandBindings を宣言するようにオンラインで非常に多くの例が教えているという事実は、問題を悪化させるだけです。
コマンドマネージャーに登録されたコマンドのインスタンスがあると思います。コマンドは、ショートカット キーなどの UI だけでなく、さまざまなソースから実行できます。
CommandManager.InvalidateRequerySuggested(); を呼び出してみてください。canexecute メソッドにブレークポイントを追加して、これが事実であることを確認します。
お役に立てれば。