コントロールの周りに赤い枠線とエラー メッセージを表示するためのテンプレートがあります。動作します (TextBoxes と ComboBoxes でテスト済み)。しかし、2 つの特定のコンボボックスではそうではありません。
VM の違いを見てみましょう。
- 基本クラスに共通の検証実装があるため、変更はありません
- 同じ種類の非同期にロードされたデータが表示され、1 つのパネルだけで検証とうまく機能します。
要するに、VMに違いはありません。
ビューはまったく同じで、同じスタイルが適用されているため、要するに違いはありません。
だから私はすでにそこに追加NotifyOnValidationError=True
し、ValidatesOnDataErrors=True
購読しましたValidation.Error
...そしてそれは発火しました!!! それでも、テンプレートはまだ表示されません。アイデアがありません。確認すべきことを教えてください。
編集:さらなる研究:
DataErrorValidationRule を逆コンパイルし、MyDataErrorValidationRule として再コンパイルして、オリジナルにできるだけ近づけました。を削除ValidatesOnDataErrors=True
し、ValidationRule を追加してデバッグしました。正しいエラー メッセージを含む str が 2 回返さnew ValidationResult(false, (object)str);
れました。1 回はプロパティを null に設定するため、もう 1 回はオブジェクト全体を強制的に検証するためです。テンプレートはまだ表示されません。
また、コントロールで Validation.GetErrorTemplate をチェックしました (Validation.Error の最初の発火時)。それはNOT NULLだったので、DynamicResource
どちらも失敗しませんでした。
編集:作業例:
<ItemsControl ItemsSource="{Binding QuestionAnswers}">
<ItemsControl.Resources>
<!-- ... -->
<DataTemplate DataType="{x:Type Model:QuestionAnswerModel}">
<StackPanel>
<!-- here is the combo box -->
<ComboBox Margin="8,4" Padding="8" MinWidth="120" HorizontalAlignment="Left"
Validation.ErrorTemplate="{DynamicResource DefaultValidationErrorTemplate}"
ItemsSource="{Binding Options.Source}"
DisplayMemberPath="ItemName" SelectedValuePath="ItemID"
SelectedValue="{Binding Options.SelectedID, ValidatesOnDataErrors=true}" />
</StackPanel>
</DataTemplate>
</ItemsControl.Resources>
</ItemsControl>
動作しない例:
<ComboBox Margin="8,4" Padding="8" MinWidth="120" HorizontalAlignment="Left"
Validation.ErrorTemplate="{DynamicResource DefaultValidationErrorTemplate}"
SelectedItem="{Binding Type.SelectedItem, ValidatesOnDataErrors=True, NotifyOnValidationError=True}" Validation.Error="ComboBox_Error"
ItemsSource="{Binding Type.Source}"
DisplayMemberPath="Localized"
>
それらは同じ xaml ファイルからのものであり、動作中の ComboBox を含む ItemsControl は、動作していない ComboBox と同じグリッドにあります。
唯一の違いは、SelectedItem または SelectedValue がバインドされているかどうかですが、検証には関係ありません...