0

ビューモデルにエラー検証UserNameがあり、少なくとも 2 文字の長さでない場合、検証エラーが発生します。

アプリケーションの起動時に、このフィールドは検証されず、エラーはないと見なされます。セッターが呼び出されたときだけ、入力が有効かどうかをチェックします。私のフォームでは、ロード時に の周りに赤いボックスがないという結果になりましたTextBox。ただし、ユーザーが文字を入力するとすぐにUserNameセッターが呼び出され、長さが 2 文字未満であるため、検証エラーが発生します。

これはデフォルトでどのように機能するかであり、これが私が望むものです。フォームを開いたまま開始したくありませんTextBox

さて、このフォームには、ICommand に関連付けられたボタンがあります。フォーラムが読み込まれると、UserName技術的にフィールドにエラーがないと見なされるため、ボタンが有効になります。ただし、ユーザーが 1 文字を入力すると、無効になり、すべてを削除すると無効のままになります。

エラーなしでフォームをロードしたいが、ボタンを無効にしたい。

現在、私のCanExecute()メソッドは、ViewModel にあるフィールドをチェックしています。これは基本的に、errorsリスト カウントが 0 より大きいかどうかをチェックします。0 より大きい場合は、エラーがあるため true を返します。そうでない場合は false を返します。

上記のジレンマを解決する方法はありますが、好きではありません。私はそのように小切手を持っています。

return UserName.Length < 2 || errors.Count > 0

これで問題ないように思えますが、 や など、チェックするフィールドがもっとたくさんある場合は、AddressこれらPortも追加する必要があります。これが実際に行うのは、この初期 false を に提供することだけでありCanExeute()、それ以外の場合は冗長になるため役に立ちません。UserName.Length < 2もちろん、配列errors.にはいくつかのエラーがあります。

ICommandこの場合はDelegateCommandfromであるmy を作成すると、Prismそれを false に初期化して無効にすることができます。

4

1 に答える 1

-1

コマンドが最新の「基準」を見ていることを確認するために、コマンドの「CanExecute」を強制するだけでよいようです。

インターフェイスはイベント ハンドラの宣言を必要とするため、

public event EventHandler CanExecuteChanged;

ICommand ハンドラー クラスに次のようなものがあると確信しています。

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

つまり、ICommand オブジェクト参照がインスタンス化されているビュー モデルの起動時に、私はただ

yourICommandButton.RaiseCanExecuteChanged();

これにより、イベントのチェックが強制され、フィールドでの最初のキーストロークの前でも、有効または無効として更新されます。

明確化... 「ボタン」について言及しましたが、ビュー モデルには実際の「ボタン」はなく、Execute/CanExecute バインディングを介してボタンのアクションを処理する ICommand オブジェクトがあることはわかっています。

「赤」の境界線の更新に関しては、ICommand ハンドラーに「RaiseCanExecuteChanged」を要求しているだけでは発生しません。「CanExecute」関数が FALSE を返す場合、ユーザーに対して無効になります...

public bool CanUserClickMe()
{
   return UserName.Length > 1 && errors.Count == 0;
}

これは、明示的なフィールドに対して実際に検証テストを呼び出すのではなく、ユーザーが既に使用できるプロパティを確認するだけです。ユーザー名が少なくとも 2 文字でない場合、FALSE が返され、ICommand オブジェクトに関連付けられたボタンが無効になります。

于 2013-01-17T19:06:46.773 に答える