私は次のアプローチを取りました、そしてそれはうまくいきます。基本的に、オブジェクトがインスタンス化されたばかりで、ユーザーがまだテキストを入力していない場合でも、モデルはエラーを正しく記録し、辞書にリストする必要があります。そのため、モデルコードまたはIDataErrorInfo検証コードを変更しませんでした。代わりに、最初にValidation.Error Templateプロパティを{x:Null}に設定しました。次に、Validation.Errorテンプレートを使用しているものに戻すTextBoxのLostFocusイベントを接続するコードがあります。テンプレートを交換し、LostFocusイベントハンドラーをアプリケーション内のすべてのTextBoxにアタッチするために、いくつかの依存関係プロパティを使用しました。これが私が使用したコードです。
依存関係のプロパティとLostFocusコード:
public static DependencyProperty IsDirtyEnabledProperty = DependencyProperty.RegisterAttached("IsDirtyEnabled",
typeof(bool), typeof(TextBoxExtensions), new PropertyMetadata(false, OnIsDirtyEnabledChanged));
public static bool GetIsDirtyEnabled(TextBox target) {return (bool)target.GetValue(IsDirtyEnabledProperty);}
public static void SetIsDirtyEnabled(TextBox target, bool value) {target.SetValue(IsDirtyEnabledProperty, value);}
public static DependencyProperty ShowErrorTemplateProperty = DependencyProperty.RegisterAttached("ShowErrorTemplate",
typeof(bool), typeof(TextBoxExtensions), new PropertyMetadata(false));
public static bool GetShowErrorTemplate(TextBox target) { return (bool)target.GetValue(ShowErrorTemplateProperty); }
public static void SetShowErrorTemplate(TextBox target, bool value) { target.SetValue(ShowErrorTemplateProperty, value); }
private static void OnIsDirtyEnabledChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs args) {
TextBox textBox = (TextBox)dependencyObject;
if (textBox != null) {
textBox.LostFocus += (s, e) => {
if ((bool) textBox.GetValue(ShowErrorTemplateProperty) == false) {
textBox.SetValue(ShowErrorTemplateProperty, true);
}
};
}
}
IsDirtyEnabled依存関係プロパティがtrueに設定されている場合、コールバックを使用してTextBoxのLostFocusイベントをハンドラーにアタッチします。ハンドラーは、ShowErrorTemplate添付プロパティをtrueに変更するだけです。これにより、TextBoxのスタイルトリガーがトリガーされ、TextBoxがフォーカスを失ったときにValidation.Errorテンプレートが表示されます。
テキストボックススタイル:
<Style TargetType="{x:Type TextBox}">
<Setter Property="Validation.ErrorTemplate" Value="{StaticResource ValidationErrorTemplate}"/>
<Setter Property="gs:TextBoxExtensions.IsDirtyEnabled" Value="True" />
<Style.Triggers>
<Trigger Property="gs:TextBoxExtensions.ShowErrorTemplate" Value="false">
<Setter Property="Validation.ErrorTemplate" Value="{x:Null}"/>
</Trigger>
</Style.Triggers>
</Style>
これは単純なことにはコードが多すぎるように思えるかもしれませんが、使用しているすべてのテキストボックスに対して1回だけ実行する必要があります。
よろしく、ニルヴァン。