問題タブ [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.
wpf - CanExecuteChanged と RaisePropertyChanged を単体テストする方法
私は厳密な TDD を実践しようとしていますが、DelegateCommands に関連する問題に遭遇し、CanExecute が呼び出されたことをテストしています。
これらは私の 2 つのテスト タイトルです。「リストからアイテムを選択すると、子アイテムを追加できるはずです」
CanAddChildItems が単体テストによって呼び出されることはないため、最初のテストに合格するようになりました。そのため、CanAddChildItems が呼び出されることを確認するために 2 番目のテストを作成しました。AddChildItems.RaiseCanExecuteChaned() を SelectedListItem のセッターに入れても、そうではありません。
明らかに、アプリケーションは AddChildItems.RaiseCanExecuteChaned() なしでは必要に応じて動作しませんが、実際にテストするテストがなければ、それを入れることはできません!
このシナリオを自信を持ってテストする方法はありますか?
c# - バックグラウンド スレッドで OleDbDataAdapter を使用すると、UI が正しく更新されませんか?
ユーザーが Excel ファイルを選択できるアプリがあり、その Excel ファイルはOleDbDataAdapter
別のスレッドを使用して読み取られ、読み取りが完了すると、ViewModel の Command の CanExecute プロパティが true に更新され、[保存] ボタンが有効になります。
私の問題は、コマンドの PropertyChanged イベントが発生し、CanExecute が true として評価されたとしても、ユーザーがアプリケーションと対話するために何かを行う (クリックする、テキストボックスを選択するなど) まで、UI のボタンが有効にならないことです。 )
問題を示すサンプル コードを次に示します。SaveCommand
とにバインドされた 2 つのボタンに接続し、テストするために呼び出されSelectExcelFileCommand
た列を含む Excel ファイルを作成するだけです。ID
Sheet1
編集
Dispatcher を使用して PropertyChanged イベントを後の優先度で送信し、PropertyChanged 呼び出しを非同期メソッドの外に移動しようとしましたが、どちらのソリューションも UI を正しく更新するために機能しません。
スレッドを削除するか、ディスパッチャ スレッドで Excel から読み取るプロセスを起動すると機能しますが、これらのソリューションはいずれも、Excel ファイルの読み取り中にアプリケーションをフリーズさせます。バックグラウンド スレッドでの読み取りの要点は、ファイルの読み込み中にユーザーがフォームの残りの部分に入力できるようにすることです。このアプリが使用された最後のファイルには、ほぼ 40,000 レコードがあり、アプリケーションが 1、2 分間フリーズしました。
wpf - WPF CanExecute と ThreadPool
私のアプリケーションは Web サービス呼び出しを実行し、それが発生すると、IsExecuting ステータスが true に設定され、実行ボタンが無効になります。この期間中はアプリケーションが応答しないため、プロセスを変更して、実行が別のスレッドで行われるようにします。しかし、私が今気づいている問題は、実行ボタンがまだ無効になっていて、インターフェイスをクリックしたときにのみボタンが有効になることです。どうすればこれを修正できますか?
編集: コードビハインド:
wpf - CanExecute(または何か)をWPFにキャッシュしますか?
System.WebのCacheオブジェクトは、かなりおかしくなります。
CommandBinding.CanExecuteを次のように処理します。
私のシナリオでは、NotInsignificantRoutine()の戻り値は5秒のウィンドウ内で変化しません。WPFにキャッシュするための最良の方法は何でしょうか?System.Webをインポートしますか?
c# - RelayCommand にバインドされている ContextMenu アイテムが常に無効になっているのはなぜですか?
私は現在、MVVM Light Toolkit を Josh Smith の RelayCommand と組み合わせて使用する、最初の大きな WPF MVVM アプリケーションに取り組んでいます。私が遭遇した問題は、このコマンドを ContextMenu のアイテムにバインドしたことです。これは常に無効になっています。
MenuItem のコード スニペットを次に示します。
コマンドバインディングで行ったことは次のとおりです。ここで見つけた CommandReference というクラスを使用しました。
これはコマンドリファレンスそのものです:
これを行った理由は、気づいた ContextMenu でのコマンド バインディングの問題のためです (ContextMenu が論理/ビジュアル ツリーの一部ではないという事実が原因です)。ネット上でこのテーマに関するいくつかのトピックを見つけました。そのうちのいくつかで CommandReference クラスを見つけました。これは私の問題に対する良い解決策のように思えました。これらのコマンドバインディングの問題は実際にはなくなりましたが、MenuItem が無効のままであるため、コマンドの CanExecute が認識されていないようです。
ViewModel (DataContext としてビューにバインドされている) には、次のコマンドのコードがあります。
コードを機能させるために何が欠けていますか? 私が使用している CommandReference と関係があるのではないかと思いましたが、何を探すべきかわかりません。
皆さんが助けてくれることを本当に願っています!
wpf - WPF UserControl と ICommand
内部にボタンとボタンのスタイルを持つ UserControl を作成しました。このスタイルは、マウス オーバー トリガーのボタンの背景を設定します。ここで、タイプ ICommand の依存関係プロパティを追加し、ボタン コマンドをこの新しいプロパティに設定しました。コマンド バインディングは適切に機能しますが、カスタム コントロールが無効になっている場合 (canexecute = false)、マウス オーバー トリガーによって背景が変更されます。
マウスオーバートリガーを次のように変更しようとしましたが、機能しません:
誰でも助けることができますか?
wpf - コマンドの CanExecute 部分が常に呼び出されるわけではありません。何がそれを決定しますか?
MVVM を使用する私の WPF アプリケーションでは、コマンドの CanExecute 部分が呼び出されない場合があることに気付きました。
c# - CanExecute() のエラー - ダイアログを取り除く方法は?
例外が発生した場合にダイアログが閉じられ、アプリケーションがクラッシュしないように、ダイアログで例外を処理しようとしています。ご覧のとおり、単純な try-catch ブロックを使用しています。
CanExecute()
この問題は、ボタンのイベント ハンドラでエラーが発生した場合に発生します。エラーは正常にキャッチされましたがMessageBox
、ユーザーに表示するCanExecute()
と、再度実行されるため、エラーが再び発生します。最終的には、アプリケーションのクラッシュにつながります。
いくつかの情報をグーグルで検索しましたが、CanExecute()
イベントハンドラーに例外がないことを確認するように言われました. しかし、このようなことは別の場所で発生する可能性があります。そのため、すべてのメソッドを操作するのではなく、ダイアログ エントリ ポイントですべての例外を単純にキャッチしたいと考えています。
だから、私の質問は次のとおりです。ダイアログを破棄して、例外がキャッチされた後に再び表示されないようにする方法は? Close()
閉じる前にまだ呼び出しているため、機能しませんでしたCanExecute()
。
wpf - RaiseCanExecuteChangedとCanExecuteで何か問題が発生していることはわかっています
MVVMライトをいじって、必要なときにボタンを有効または無効にできるようにした後、うまくいくまで一緒にマッシュアップしました。
しかし、私はここで何か間違ったことをしていることを知っています。呼び出されている同じ領域にRaiseCanExecuteChangedとCanExecuteがあります。確かにこれはそれが行われる方法ではありませんか?
これが私のxamlです
そして、これが私のコードです
これらの2つがどのように一緒になっているのか分かりますか?確かにそれは正しくありえない。つまり...それは私にとってはうまくいきます...しかし、何かが間違っているようです。RaiseCanExecuteChangedはCanExecuteを呼び出すべきではありませんか?そうではありません...そのため、CanExecuteがそこにない場合、コントロールが必要なようにIsEnabledを切り替えることはありません。
編集:
ボタンのCommandプロパティを使用してコマンドをバインドすることになった場合...すべてが正常に機能します。CanExecuteを削除し、RaiseCanExecuteChangedをそのままにしておくと、すべてが見事に機能します。
このように...これは問題なく動作します。
wpf - RibbonGroupドロップダウンが開いていない限り、WPFコマンドのCanExecuteイベントは発生しません
RibbonTab内に約5つのRibbonGroupがあり、各リボングループには約3〜5のコマンドが含まれています。すべてを画面に表示するために、WPFリボンコントロールはいくつかのRibbonGroupをドロップダウンメニューに自動的に折りたたむ。ここまで特別なことは何もありません。
ドロップダウンが最初に開かれるまで、折りたたまれたRibbonGroups内のコマンドのCanExecuteイベントが発生しないことがわかります。(これはパフォーマンスを向上させるためかもしれません-つまり、コマンドが表示されていない限り、CanExecuteを起動する必要があります!?)
私のアプリケーションでは、RibbonGroupでコマンドが有効になっていない場合(つまり、CanExecuteがfalseの場合)、そのRibbonGroupを非表示にするロジックです。ただし、すべてのCanExecuteが起動されない限り、有効になっているコマンドの数(またはすべて)がわかりません。
これはRibbonGroupの制限ですか、それともこの動作は仕様によるものですか?コマンドが折りたたまれたRibbonGroupにあるかどうかに関係なく、すべてのCanExecuteを少なくとも1回手動で実行するための回避策はありますか。
ところで、CommandManager.InvalidateRequerySuggested()
ここでも役に立ちません。