2016-04-04 7 views
0

Xceed WPF ToolkitのDateTimePickersが2つあり、MahApps Metroを使用すると、検証エラーテンプレートはdefault one provided by Metro{DynamicResource ValidationErrorTemplate})です。Validation.ErrorTemplateは、少なくとも1回エラーが発生していない場合にのみ表示されます。

[TimeSpanValidator] 
public TimeSpan StartTime 
{ 
    get { ... } 
    set { ... } 
} 

[TimeSpanValidator] 
public TimeSpan EndTime 
{ 
    get { ... } 
    set { ... } 
} 

参照バリデータクラス:

public class TimeSpanValidator : ValidationAttribute 
{ 
    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     EditEntryViewModel viewmodel = validationContext.ObjectInstance as EditEntryViewModel; 
     if (viewmodel == null) 
     { 
      Debug.Fail("Error in validation: ViewModel was not assigned."); 
      return ValidationResult.Success; 
     } 
     if (!viewmodel.ValidTimeSpan) 
      return new ValidationResult("End time must not be earlier than start time."); 
     if (!viewmodel.TimeSpanUnoccupied) 
      return new ValidationResult("The timespan overlaps with an existing entry."); 
     return ValidationResult.Success; 
    } 
} 

これは、限りウィンドウを開くときに、私はエラーを持っていないと正常に動作検証は、検証は次のように属性を処理されます。しかし、私が既に持っている場合(私の場合は、あらかじめ設定された時間が既存のものと重なるタイムパンを作成する)、エラーテンプレートは、値を別の無効なものに変更しても、全く表示されません。一度有効な入力。

私はデバッガでバリデータをステップ実行しましたが、エラーが発生したときは常に無効な結果を返します。また、値が無効な場合、ダイアログボックスを閉じることができません。ValidTimeSpanTimeSpanUnoccupiedが正しく動作しています。実際には間違ったエラーテンプレートが表示されるだけです。そして私は理由を知りません。

また、これはエラーテンプレートでのみ発生します。私はValidation.HasErrorにツールチップをバインドするときには、ウィンドウが開いたときにエラーが既に存在する場合でも、意図したようにツールチップが表示されます。

<Style.Triggers> 
    <Trigger Property="Validation.HasError" Value="True"> 
     <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/> 
    </Trigger> 
</Style.Triggers> 

私が間違って何をしているのですか?私は何か見落としてますか?

答えて

0

確かに問題を再現する良いMinimal, Complete, and Verifiable code exampleがなければ、問題が実際に何であるかを確かに知ることは不可能です。それは...

私は同様の問題に直面しています。特に、ターゲットプロパティが変更され、ソースにコピーバックされると、検証はのみ発生します。これは、コントロールが最初に初期化されたときに発生しないため、検証のステップは実行されません。

この特定の問題の回避策は、コントロールがロードされた後にBindingExpression.UpdateSource()メソッドを呼び出すことによって検証を強制することです。私。 Loadedイベントのハンドラを追加し、そこでメソッドを呼び出します。例:

上記の方法で実際に問題が解決しない場合は、問題を確実に再現する優れたMCVEを提供して問題を改善してください。あるいは、ここの質問:Initial validation on dynamically added controlを見てください。その質問では、検証自体は問題ではなく、失敗した検証に関するユーザーのフィードバックを提供するアドオンを更新します。あなたの質問には、問題がどこにあるのか正確に伝えることができるようにするための十分な情報はまだありませんが、うまくいけば、これらの回答のどちらかが役に立ちます。

関連する問題