4

プロパティにバインドされたTextBoxがあり、そのUpdateSourceTriggerプロパティをに設定しExplicitて、いつ検証するかを制御できるようにしました。ただし、UIが読み込まれるとすぐに、コントロールが検証されます。コードビハインドからバインディングのUpdateSourceメソッドを呼び出すことはありません。なぜこれが起こっているのかわかりませんが、修正する方法がわかりません。

動作しない理由UpdateSourceTrigger="Explicit"はありますか?

助けてください!ありがとう!

編集:最初はTextBoxが空であるため、検証すると検証エラーが発生します。これは避けたい。テキストボックスがフォーカスを失ったとき、または検証ボタンをクリックしたときにのみ明示的に検証したい。これを正しく理解していれば、TextBox_LostFocusハンドラーのBindingExpressionのUpdateSourceメソッドとボタンのClickイベントハンドラーを呼び出すだけです。ただし、最初の検証を回避する方法、またはそのTextBoxにアクセスするまで検証を回避する方法を理解できません。私は回避策(私は嫌いです)を使用しましたが、これを行うためのより良い方法を見つけたいと思います。

はい、MVVMを使用しています。ご説明ありがとうございます!とても助かります。

さらに編集:はい、IDataErrorInfoを使用しています

4

1 に答える 1

8

これは通常の動作です。

DependencyProperty(この場合はText)で指定されたバインディング式は、要素が初期化/ロードされたときに初期バインドを実行します(つまり、ソースからターゲットを更新します...つまり、TextBoxのTextプロパティが次の値に設定されます指定されたパスを持つソースのプロパティ(nbは、パスが指定されていない場合は無視します))。

UpdateSourceTrigger="Explicit"ターゲット(つまり、TextBoxのTextプロパティ)の値の自動更新がソース(ViewModel / modelなど)に送信されないようにするだけです....(このオプションを更新の制御と混同しないでください。目標)。

最初のバインド中に、バインドエンジンは「ソース」にIDataErrorInfoがあることを確認し、「アイテム」が有効かどうかをチェックします。有効でない場合は、TextBoxを囲む標準エラーアドナーを取得します。 (ErrorTemplateによって定義されます)....モデル内のデータの状態と一致するように....それはすべて論理的です。

ビューの最初のロード後にエラーインジケータがあまりにも積極的に表示されないようにするには、この回避策を試すことができます。

IDataErrorInfoを変更して、検証チェックロジックを実行するタイミングを制御できるようにすることができます。

ビューがロードされた後に設定されるフラグがあります...これにより、IDataErrorInfo検証コードを実行できます...前ではありません。

その時点からロードされると、UpdateSourceを呼び出すと、無効なデータをキャッチするValidatorが起動します(Loadedフラグがtrueになり、検証ロジックが魔法のように実行するため)。

次のようなものを使用できます。

public class CustomerViewModel : IDataErrorInfo
{
    public bool DoValidation { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public string Error
    {
        get
        {
            if (DoValidation)
            {
                if (error on any properties)
                     return "error on these .....";
            }
            return null; // no errors
        }
    }

    public string this[string columnName]
    {
        get
        {
            if (!DoValidation)
            {
                return null; 
            }

            string result = null;
            if (columnName == "FirstName")
            {
                if (string.IsNullOrEmpty(FirstName))
                    result = "Please enter a First Name";
            }
            if (columnName == "LastName")
            {
                if (string.IsNullOrEmpty(LastName))
                    result = "Please enter a Last Name";
            }

            return result;
        }
    }
}

Loadedイベントが発生した後、モデルにDoValidationプロパティを設定します。

于 2012-09-05T20:10:37.113 に答える