2

私はWinFormsのデータバインディングとカスタム検証に少し慣れていません。

ドメインに単純なモデルがあるとします。

public class SecurityObject
{

    [StringLength(25)]
    public string Name { get; set; }

    public bool HasAccess { get; set; }
}

Name プロパティは、TextBox にデータ バインドされています。検証に違反したときにツールヒントを表示できるように、カスタム属性の検証を適用したいと思います。(注:はい、テキストボックスにMaximumLengthプロパティを設定できることは知っていますが、それを計画していますが、これは今のところ私の質問ではありません。)

私の質問は、どの時点で検証をトリガーする必要があるかということです。

  1. その時点では、新しい値がモデルに書き戻されていないため、TextBox_Validating(..) でトリガーできるようには見えません。

  2. それまでに値がモデルに書き戻されているため、TextBox_Validated(..) でトリガーされる可能性があります。ただし、 TextBox は有効であると考えているため、これは不適切に思えますが、バインドされているモデルはそうではありません-私には怪しいようです。

  3. 自動バインドを無効にしてから、DataBinding.WriteValue(...) を呼び出して TextBox_Validating(...) 内で手動でトリガーできると思いますが、これは非常に多くの余分な労力を費やし、データのポイントの半分を無効にするのは残念ですそもそもバインディング。

では、データバインド時にモデル検証を実行するための推奨される方法は何ですか?

4

1 に答える 1

0

IMO検証イベントは、検証が行われるべき場所です。

TextBox_Validating(..)でトリガーできるようには見えません。その時点では、新しい値がモデルに書き戻されていないためです。

値が実際にモデルに設定されているかどうかは関係ありませんか?これはどうですか:

ValidationContext vc = new ValidationContext(myEntity, null, null);
vc.MemberName = "myProperty";
Boolean isValid = Validator.TryValidateProperty(formPropertyValue, vc, null);
于 2012-12-21T01:54:16.757 に答える