WPF:Validation.ErrorTemplate不显示

时间:2012-05-29 11:23:06

标签: wpf validation 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>

非工作示例:

<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是否被绑定,但是验证不应该有任何影响......

2 个答案:

答案 0 :(得分: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>

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

编辑:如果你正在使用IDataErrorInfo,你可以试试(虽然我没有亲自测试过):

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

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

的快捷方式

答案 1 :(得分:0)

我会检查以下内容:

  • 检查你的组合框的datacontext和绑定,如果它工作并调用IDataErrorInfo(我假设你做IDataErrorInfo验证) - 下一步
  • 将您的验证模板作为本地资源复制到ComboBox.Resources并检查它是否有效

然而,如果你发布你的验证模板,你的组合框xaml和你的datacontext

那将是件好事。