問題タブ [canexecute]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - コンテキスト メニューが開いたときに CanExecute が発生しない
関連する質問がいくつかあることは知っていますが、どれも問題を見つけるのに役立ちませんでした。
ほとんどの回答は、この回答に示されているようにCanExecuteChanged を実装することを提案しています。まあ、それは私の問題の解決策ではありません。Josh Smith の実装に似た RelayCommand の実装があります。(同様に、私たちの実装はより多くの詳細を追加しますが、コアの実装は同じです。)
インターネットを検索しているときに、フォーカスされた要素がない場合、ルーティングは ContextMenu で停止し、MenuItem に到達しないこともわかりました。その場合に役立つ解決策をここに示します。
しかし、本当にフォーカスされた要素がないかスヌープに確認したところ、それは問題ではないことがわかりました。とにかく、修正は役に立ちませんでした。
また、テスト プロジェクトでその問題をシミュレートし、修正することができました。したがって、修正は一般的に機能しますが、役に立たないだけです。ただし、機能させるために修正を少し調整する必要がある可能性はまだあると思います。as AncestorTypeMyControl
の代わりに試してみました。 asの代わりに試しました。ContextMenu
PlacementTarget.Tag
PlacementTarget
Path
しかし、それを機能させるために他に何をしようとしているのかわかりません(これがバグであると仮定して)。
面白いことに、手動で CommandManager.InvalidateRequerySuggested() を呼び出しても機能しません。ContextMenuOpening で発生するコマンドを追加しました。これにより CanExecute が強制的に実行されると思いましたが、間違っているようです。
そのため、ContextMenu が開かれたときにハンドラーが発生しない理由と、CanExecute
それを修正する方法をさらに探しています。
これが私のXAMLコードです(EventTrigger
forを含むContextMenuOpening
):
MyCommand
(Can)Execute ハンドラの定義は次のとおりです。
の CanExecute を強制的に発生させようとしたOnContextMenuOpening
ハンドラーは次のとおりです。MyCommand
c# - コマンドを実行できなかったことをユーザーに通知する
次のようなコマンドに関連付けられた TextBox があります。
プロパティTextContent
は、ViewModel で定義された文字列です。このコマンドMyCommand
は ViewModel でも定義されています。ViewModel は View を認識していません。
このコマンドは、TextBox にフォーカスがあり、Enter キーが押されるたびに呼び出されます。残念ながら、CanExecute
false が返された場合、ユーザーは、コマンドが実行されなかったことを (視覚的に) 確認できません。これは、TextBox に視覚的な変化がないためです。
Enter キーを押した後にコマンドを実行できなかったことをユーザーに示す方法についてのアドバイスを探しています。
私の考え(およびそれらについての私の疑問):
CanExecute
が返されたときに TextBox を無効にする: の戻り値は文字が入力/変更されるたびに変わる可能性がfalse
あるため、これはオプションではありません(TextBox 内のテキストは の結果に影響します)。初めて無効にすると、ユーザーはそれ以上入力できないため、永久に無効のままになります。CanExecute
CanExecute
コマンドが実行されなかったことを示すメッセージ ボックスを表示します。ViewModel は View を認識しないことに注意してください。ViewModel からメッセージ ボックスを開くことはできますか? さらに、メッセージボックスを開くための呼び出しはどこに置くべきですか?
CanExecute
Enterキーを押した後にのみメッセージボックスを取得したいので、内部ではありません。毎回CanExecute
returnではありませんfalse
。たぶん、CanExecute
常に returntrue
を作成し、内部でチェックを行いますExecute
: チェックが問題ない場合は、コマンドを実行し、そうでない場合は、ユーザーにメッセージを表示します。しかし、それでは、持つという点がCanExecute
完全に失われています...
私はMVVMを維持したいのですが、ViewModelにリダイレクトするためのコードビハインドは私にとっては問題ないようです。
mvvm - WPF MVVM コマンド CanExecute、フォーカス変更時にのみ再評価
WPFでMVVMプロジェクトをリファクタリングして、MVVM パターンのユーザー間で共通の問題と思われるものを取り除こうとしています。
DataContextがMyViewModelであるビューがあります。これは、Execute と CanExecute の両方を実装する Command にバインドされたボタンです。
XAML:
MyViewModelはConnectCommandを公開します:
(最後に私が使用している DelegateCommand の定義)
MyViewModelは、コマンドの CanExecute 部分で使用されるプロパティIsConnectEnabledも公開します。
MyViewModelクラスはINotifyPropertyChangedインターフェイスを実装します
コマンドのCanExecute部分は、アプリケーションでフォーカスが変更されたとき (つまり、クリックしたとき) にのみ評価されます。UpdateSourceTriggerはデフォルトでPropertyChangedに設定されていることを知っているため、現在の解決策は、コード内のいくつかの場所でPropertyChangedイベントを手動で発生させることです。しかし、 IsConnectEnabledの値が変更されるたびに、このアクティビティを自動的に実行したいと考えています。
WPF と MVVM パターンはこの問題の解決策を提供しますか?
完全を期すために、私が使用している完全なICommand実装、 DelegateCommandに従います。