5

コントロールの周りに赤い枠線とエラー メッセージを表示するためのテンプレートがあります。動作します (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 がバインドされているかどうかですが、検証には関係ありません...

4

2 に答える 2

1

イベントが発生しているにもかかわらず、エラー テンプレートが表示されないという正確な問題があり、一部のコントロールでのみ発生し、他のコントロールでは発生しなかった理由を理解できませんでした。

私が最終的に見つけた回避策は、バインディングのValidationSteptoConvertedProposedValueを設定することでした:ValidationRule

<TextBox>
  <TextBox.Text>
    <Binding Path="MyField">
      <Binding.ValidationRules>
        <Validation:MyValidationRule ValidationStep="ConvertedProposedValue" Message="Please enter a value." />
      </Binding.ValidationRules>
    </Binding>
  </TextBox.Text>
</TextBox>

とにかく、それは私にとってはうまくいくようでした!

編集: IDataErrorInfo を使用している場合は、試すことができます (個人的にはテストしていませんが):

<Binding Path="MyField" ValidatesOnExceptions="True">
  <Binding.ValidationRules>
    <DataErrorValidationRule ValidationStep="ConvertedProposedValue" />
  </Binding.ValidationRules>
</Binding>

つまり remove ValidatesOnDataErrors=True、これは単一のを含めるための単なるショートカットです<DataErrorValidationRule />

于 2012-05-29T11:44:16.640 に答える
0

私は以下をチェックします:

  • コンボボックスの datacontext とバインディングを確認し、それが機能し、IDataErrorInfo が呼び出された場合 (IDataErrorInfo 検証を行うと仮定します) - 次のステップ
  • 検証テンプレートをローカル リソースとして ComboBox.Resources にコピーし、機能するかどうかを確認します

それでも、検証テンプレート、コンボボックス xaml、およびデータ コンテキストを投稿するとよいでしょう。

于 2012-05-29T12:24:40.337 に答える