これは通常の動作です。
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プロパティを設定します。