WPF:Validation.ErrorTemplate 未显示

标签 wpf validation mvvm idataerrorinfo

我有一个用于在控件周围显示红色边框和错误消息的模板。它有效(在文本框和组合框上测试)。但在两个特定的组合框中却没有。
好吧,让我们看看虚拟机中有什么不同:

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

简而言之,虚拟机没有区别。
View 完全相同,应用相同的样式,所以简而言之,也没有区别。

所以我添加了NotifyOnValidationError=TrueValidatesOnDataErrors=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 是否已绑定(bind),但这不应该对验证有任何影响...

最佳答案

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

我最终找到的解决方法是设置 ValidationStepConvertedProposedValue关于ValidationRule对于绑定(bind):

<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 /> 的快捷方式

关于WPF:Validation.ErrorTemplate 未显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10798163/

相关文章:

c# - 在 Viewmodel 中保存 View 的更改吗?

javascript - MVC 3 : running javascript after validation has completed but before the actual post?

html - 如何更改或删除 HTML5 表单验证默认错误消息?

c# - 如何通过使用 MVVM 的 Prism (+ MEF) View 中的特定控件的可用性来控制 WPF 4.5 Ribbons 上下文选项卡的可见性?

c# - WPF 文本框 TAB 空格

c# - 将 Shapes.Path 项目绑定(bind)到 ItemsControl

Python Attrs 在设置属性时触发转换器

c# - 在 MVVM 中使用 dispose 取消订阅事件

wpf - 我怎样才能知道哪个TextBox最后一次获得焦点?

c# - 需要知道当另一个元素失去焦点时哪个元素获得焦点