WPF:Validation.ErrorTemplate不显示

TDa*_*ver 5 validation wpf mvvm idataerrorinfo

我有一个用于显示红色边框和控件周围错误消息的模板。它可以工作(在TextBoxes和ComboBoxes上测试)。但是在两个特定的组合框上却没有。
好吧,让我们看看VM的不同之处:

  • 因为我的基类中有通用的验证实现,所以那里没有变化
  • 将显示相同类型的异步加载的数据,该数据与仅通过一个面板进行的验证即可很好地进行

简而言之,VM没什么区别。
视图是完全相同的,使用了相同的样式,因此总之两者之间也没有区别

因此,我添加NotifyOnValidationError=True到了ValidatesOnDataErrors=True已经存在的位置,并订阅了Validation.Error... 并且它被触发了!但是模板仍然没有显示。我没有主意,请建议我检查一下!

编辑:进一步的研究:

我已经反编译了DataErrorValidationRule,并将其重新编译为MyDataErrorValidationRule,以使其与原始数据尽可能接近。我删除了ValidatesOnDataErrors=True,并添加了ValidationRule进行调试。它返回new ValidationResult(false, (object)str);了两次包含正确错误消息的str-一次用于将属性设置为null,一次用于强制验证整个对象。模板仍未显示。

我还检查了控件上的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>
Run Code Online (Sandbox Code Playgroud)

非工作示例:

<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"
                          >
Run Code Online (Sandbox Code Playgroud)

它们来自相同的xaml文件,包含有效ComboBox的ItemsControl与无效ComboBox位于同一网格中。

唯一的区别是,是否绑定了SelectedItem或SelectedValue,但这与验证没有任何关系...

Ros*_*oss 1

我遇到了确切的问题,即使事件正在触发,错误模板也不会显示,并且永远无法弄清楚为什么它只发生在某些控件而不是其他控件上。

我最终找到的解决方法是将绑定ValidationStep设置ConvertedProposedValueValidationRule

<TextBox>
  <TextBox.Text>
    <Binding Path="MyField">
      <Binding.ValidationRules>
        <Validation:MyValidationRule ValidationStep="ConvertedProposedValue" Message="Please enter a value." />
      </Binding.ValidationRules>
    </Binding>
  </TextBox.Text>
</TextBox>
Run Code Online (Sandbox Code Playgroud)

无论如何,这似乎对我有用!

编辑:如果您正在使用 IDataErrorInfo,您可以尝试(尽管我没有亲自测试过):

<Binding Path="MyField" ValidatesOnExceptions="True">
  <Binding.ValidationRules>
    <DataErrorValidationRule ValidationStep="ConvertedProposedValue" />
  </Binding.ValidationRules>
</Binding>
Run Code Online (Sandbox Code Playgroud)

即删除ValidatesOnDataErrors=True,这只是包含单个<DataErrorValidationRule />