問題タブ [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 - リレーコマンド CanExecute が正しくない値を返す
canExecute パラメーターを使用して、非常に標準的な MVVM Light RelayCommand を作成します。
() => (customer.Regions.Count > 0)
必要に応じて呼び出すRaiseCanExecuteChanged();
と、canExecute が正しく再評価されません。次に、次のように手動でも呼び出します: var canExecute = myCommand.CanExecute(null);
、それでも間違っています。I do の直後の次のステートメントvar foo = (customer.Regions.Count > 0)
では、正しい結果が返されます。ここで何が起こっているのですか?
コマンド定義:
customer は、クラスがインスタンス化されるときに設定されるプライベート プロパティです。
wpf - WPF-ボタンコントロールテンプレート...Command.CanExecuteがfalseの場合、テンプレートアイテムを有効のままにします
各アイテムがボタンを含むdataTemplateで構成されているlistViewがあります。これは、リストアイテムをクリックすると、ボタンクリックのように機能して「ウィザード」の次のステップに移動するという要件によるものです。
DataTemplateの各ボタンには、ControlTemplateが含まれています。
コマンドのCanExecuteがfalseの場合、このcontrolTemplate内の項目は無効になります。具体的には、以下の私の例では、ボタンのテンプレート内のボタン(テンプレートとして画像を含むもの)も無効になっています。
そのボタンに関連付けられたコマンドが無効になっている場合でも、テンプレート内のアイテムを有効に保つにはどうすればよいですか。
概要:ボタンには、別のボタンを含むテンプレートがあります。親ボタンのコマンドが無効になっている場合、テンプレート内のボタンは無効になります。
XAML:
wpf - ICommand CanExecute を false で開始する方法は?
ビューモデルにエラー検証UserName
があり、少なくとも 2 文字の長さでない場合、検証エラーが発生します。
アプリケーションの起動時に、このフィールドは検証されず、エラーはないと見なされます。セッターが呼び出されたときだけ、入力が有効かどうかをチェックします。私のフォームでは、ロード時に の周りに赤いボックスがないという結果になりましたTextBox
。ただし、ユーザーが文字を入力するとすぐにUserName
セッターが呼び出され、長さが 2 文字未満であるため、検証エラーが発生します。
これはデフォルトでどのように機能するかであり、これが私が望むものです。フォームを開いたまま開始したくありませんTextBox
。
さて、このフォームには、ICommand に関連付けられたボタンがあります。フォーラムが読み込まれると、UserName
技術的にフィールドにエラーがないと見なされるため、ボタンが有効になります。ただし、ユーザーが 1 文字を入力すると、無効になり、すべてを削除すると無効のままになります。
エラーなしでフォームをロードしたいが、ボタンを無効にしたい。
現在、私のCanExecute()
メソッドは、ViewModel にあるフィールドをチェックしています。これは基本的に、errors
リスト カウントが 0 より大きいかどうかをチェックします。0 より大きい場合は、エラーがあるため true を返します。そうでない場合は false を返します。
上記のジレンマを解決する方法はありますが、好きではありません。私はそのように小切手を持っています。
これで問題ないように思えますが、 や など、チェックするフィールドがもっとたくさんある場合は、Address
これらPort
も追加する必要があります。これが実際に行うのは、この初期 false を に提供することだけでありCanExeute()
、それ以外の場合は冗長になるため役に立ちません。UserName.Length < 2
もちろん、配列errors.
にはいくつかのエラーがあります。
ICommand
この場合はDelegateCommand
fromであるmy を作成すると、Prism
それを false に初期化して無効にすることができます。
wpf - VS2010オンラインテンプレート「WPFMVVMプロジェクトテンプレート」を使用すると、CanExecuteChangedが機能しませんか?
[オンラインテンプレート]->[VS2010のWPF]->[WPFMVVMプロジェクトテンプレート]を使用して、新しいWPFMVVMアプリケーションを作成しました。「更新を有効にしますか?」というラベルの付いたチェックボックスを作成しました。クリックしたときに「更新」ボタンを有効/無効にしたい「更新」ボタンの横。IsChecked
チェックボックスのaMainWindowViewModel
プロパティを呼び出したプロパティにバインドすると、セッターCanRefreshDate
で発生します。RaisePropertyChanged(()=>CanRefreshDate);
また、にMainWindowViewModel
、新しく作成CanExecuteRefreshDate()
したプロパティを追加しました。これは、プロパティのブール値を返しCanRefreshDate
ます。ただし、チェックボックスをクリックすると、[更新]ボタンが有効/無効になりません。これを修正する適切な方法は何ですか?これはテンプレートの見落としですか、それとも何ですか?
テンプレートコードに対する私の変更は次のとおりです。
Xaml:
MainWindowViewModel.cs:
RaiseCanExecuteChanged()
テンプレートのスペルRasieCanExecuteChanged()
がDelegateCommand.csで間違っていることに気づき、それを変更しました。RaiseCanExecuteChanged()
を削除して変更することで、すべてを機能させることができました
に :
ただし、これに対する適切な解決策と、テンプレートが機能しない理由を知りたいと思います。私は何かが足りないのですか、何か間違ったことをしているのですか、それとも何ですか?新しいソリューションを作成し、私が作成したテンプレートを使用して、何が起こっているのか教えてください!ありがとう!
wpf - WPF ボタン コマンド バインディングは更新されましたが、ボタンは無効のままです
ボタンのコマンドバインディングが更新されないという奇妙な問題があります...
ユーザーが医療システムのリストを維持できるようにする、MvvmLight で作成されたアプリがあります。これらのシステムはテンプレートから構築されます (つまり、テンプレートは 2 台のカメラ、1 台のフレームグラバーなど、およびこれらの各パーツに含まれる必要がある詳細を指定する場合があります)。テンプレートが変更された場合、新しいテンプレートを使用するようにシステムをアップグレードできます。システム ウィンドウとテンプレート ウィンドウはどちらもモードレスなので、システムを見ながらテンプレートを変更できます。テンプレート ウィンドウ ビュー モデルは、テンプレートが更新された場合にメッセージを送信するため、開いているシステム ウィンドウはそれに応じて反応します。
システム ビューは、システムをアップグレードする必要があるときにユーザーに警告するために使用される Border を保持します。境界線の可視性は、システムのリビジョン番号を基になるテンプレートの最新のリビジョン番号と比較するシステム エンティティの bool プロパティにバインドされます。最新のテンプレート リビジョンを使用している場合は、[表示] が [折りたたみ] に設定されているため、コンテンツは表示されません。
システムが古いリビジョンを使用している場合、Border が表示され、コンテンツにはアップグレードの必要性を知らせるメッセージと、アップグレードを実行するボタンが含まれます。この境界線とボタンには 3 つのシナリオがあります...
1) ウィンドウを開いたときにシステムが古いリビジョンを使用している場合、境界線が表示され、ボタンが表示されます。テンプレートが変更されると、メッセージが正しく更新されて新しい番号が表示され、ボタンは表示されたままになります。正解です。
2) システムが開かれたときに最新のテンプレート リビジョンを使用していた場合、テンプレートがリビジョンされると、境界線が正しく表示され、メッセージが正しく更新され、ボタンが有効になります。繰り返しますが、後でシステム ウィンドウを閉じる限り、これは正しいことです。
3)ただし、更新ボタンをクリックすると、システムがアップグレードされて境界線が非表示になった後、テンプレートが再度更新され、境界線が再表示されるとボタンが無効になります。CanExecute メソッドからすべてのロジックを削除して true を返そうとしたので、ボタンを有効にする必要がありますが、そうではありません。ボタンを有効にするには、システム ウィンドウを閉じてから再度開く必要があります。
テンプレートが更新されるたびに発生させたビューモデルにイベントを追加してみました。ビューでこのイベントをキャッチし、ボタンのコマンド バインドを手動で更新しました。ただし、これによって CanExecute メソッドが再度呼び出されることはなく、ボタンは無効のままでした。
これは少しややこしく、全体を見ないとデバッグが難しいことは承知していますが、誰かが私にいくつかの手がかりを与えてくれることを願っています。それが役立つ場合、ここに関連するコードがあります...
まず、ボーダー、メッセージ、ボタンの XAML を...
含まれているのは「return true;」だけなので、CanExecute メソッドを表示しても意味がありません。この時点で!
境界線の可視性とボタンの有効状態の間で奇妙な相互作用が起こっているように見え、これが CanExecute メソッドの結果をオーバーライドしているようです。
誰でもアイデアはありますか?ここで重要なことを追加するのを忘れていたら、お気軽にお尋ねください。前もって感謝します。
wpf - フィールド変更時にWPFコマンドを実行できます
私がやりたいことはかなり単純ですが、それを行う方法に関してオンラインで例を見たことがありません。フィールドが変更された場合に「更新」ボタンを有効にしたい。
コンテキスト: データベース内の行を更新する WPF フォームがあります。フォームの値を変更しない限り、ユーザーが [更新] ボタンをクリックできないようにしたいと考えています。私は MVVM パターンを使用しており、更新可能な 4 つのプロパティ (名前、住所、電話、電子メール) があります。ユーザーがこれらのプロパティのいずれかを変更しない限り、[更新] ボタンを有効にしたくありません。
ありがとう!
コマンド コード (CanExecute にどのような種類の検証を入れればよいかわかりません)
wpf - コンテキスト メニューを開いたときに ICommand CanExecute を強制的に再評価する
ビュー モデルで CanExecute の再評価を強制できることはわかっていますが、これにはビュー モデルが関連するすべてのデータ変更イベントに登録する必要があり、常に実行できるとは限りません。
コマンドはコンテキスト メニューでのみ使用され、コンテキスト メニューが開いている間は CanExecute に影響するデータを変更できないため、コンテキスト メニューが開いているときにだけ CanExecute を再評価すれば十分です。
これを行うには、コンテキスト メニューを開くイベントをフックし、ビュー モデルを呼び出して、コンテキスト メニューが使用する各 ICommand で RaiseCanExecuteChanged を呼び出すことができますが、これは面倒であり、MVVM に反します。これを達成するためのより簡単な方法があるかどうか疑問に思っていますか?