0

検証ルールを使用してカスタムメッセージを表示し、INotifyDataErrorをビジネスルールに使用しています。

私のコードのこの部分:

public class ResponseValidation : ValidationRule
{
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        int? response;
        bool noIllegalChars = TryParseStruct<int>(value.ToString(), out response);


        if (!noIllegalChars)
        {
            return new ValidationResult(false, "Input is not in a correct format.");
        }
        else
        {
            value = null;
            return new ValidationResult(true, null);
        }
    }

    ... 
}

検証はNullableデータ型に対するものです。つまり、値はnullまたは整数にすることができますが、「5b」のような誤った入力はできません。

問題は、このエラー(noIllegalChars = true)が発生する場合、プロパティに値nullを設定するにはどうすればよいですか?

編集:私がこれを行っている理由は、ユーザーがテキストボックスを空のままにしたとき(値は "")、技術的にはnull値であるプロパティに対して、プロパティに""を設定しようとしているためです。

4

3 に答える 3

1

技術的には、参照によって値を渡すことができます。

public override ValidationResult Validate(ref object value, System.Globalization.CultureInfo cultureInfo)

哲学的に-検証ルールで値を変更しますか、それとも値が不良であることを通知するだけですか?ユーザーの観点からすると、値を入力しようとすると、システムはそれが無効であると通知しますが、それを修正する機会を与えず、最初からやり直すだけで、煩わしいかもしれません。

検証を要求するコードが値をnullに設定する場合は、次のように選択します。

int? result;
string input = "5b"

ValidationResult response = ResponseValidation().Validate(input, CultureInfo.CurrentCulture);
if (!response.IsValid) 
    result = null;
else
    result = int.Parse(input, CultureInfo.CurrentCulture);

ちょうど私の2セント...

于 2012-01-25T03:21:14.683 に答える
0

valueがrefparamでない限り、できません。ただし、ロジックを分離しようとしている場合は、データが有効かどうかの決定は、入力フィールドのクリアなど、その決定後に実行したいこととは異なる必要があります。

例えば:

if (!rule.Validate(val, CultureInfo.CurrentCulture).IsValid)
{
    //Clear the field... whatever else you want to do
}
于 2012-01-25T03:27:43.990 に答える
0

以前の回答では、値をValidate関数byrefに渡すことについて説明しました。これは、言及されているように意味的に正しくないだけでなく、これを行うオーバーロードされたValidate関数を作成した場合、内で検証ルールを宣言すると、バインディングサブシステムはそれを呼び出しません。 XAML。確かにプログラムで呼び出すことはできますが、その方法でしか到達できないコードを使用してValidationRulesの作成を開始すると、自分の足を踏みにじることになります。

実行するより適切なアクションはint?、空の文字列が渡された場合にデフォルトを返すフィールドでコンバーターを使用することです。

于 2012-01-25T20:47:38.683 に答える