WPF:Validation.ErrorTemplate未显示
我有一个用于在控件周围显示红色边框和错误消息的模板。它可以工作(在文本框和组合框上测试)。但在两个特定的组合框上,它们没有。WPF:Validation.ErrorTemplate未显示,wpf,validation,mvvm,idataerrorinfo,Wpf,Validation,Mvvm,Idataerrorinfo,我有一个用于在控件周围显示红色边框和错误消息的模板。它可以工作(在文本框和组合框上测试)。但在两个特定的组合框上,它们没有。 让我们看看虚拟机有什么不同: 由于我在基类中有通用的验证实现,所以没有任何更改 显示的是同一种异步加载的数据,只需一个面板就可以很好地进行验证 因此,简言之,VM没有区别。 视图是完全相同的,应用了相同的样式,因此简言之,也没有区别 因此,我将NotifyOnValidationError=True添加到已经存在的validateOnDaerrors=True中,并订
让我们看看虚拟机有什么不同:
- 由于我在基类中有通用的验证实现,所以没有任何更改
- 显示的是同一种异步加载的数据,只需一个面板就可以很好地进行验证
视图是完全相同的,应用了相同的样式,因此简言之,也没有区别 因此,我将
NotifyOnValidationError=True
添加到已经存在的validateOnDaerrors=True
中,并订阅了Validation.Error
然后它发射了!!!但模板仍然没有显示我没有主意了,请给我建议一些要检查的东西强>
编辑:进一步研究:
我已经反编译了DataErrorValidationRule,并将其重新编译为MyDataErrorValidationRule,以尽可能接近原始版本。我删除了validatesOnDaerRors=True
,并将我的ValidationRule添加到调试中。它返回newvalidationresult(false,(object)str)代码>与str一起包含两次正确的错误消息-一次用于将属性设置为null,一次用于强制验证整个对象模板仍不显示。
我还检查了控件上的Validation.GetErrorTemplate(在第一次触发Validation.Error时),它不是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"
>
非工作示例:
<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文件,包含工作组合框的ItemsControl与非工作组合框位于同一个网格中
唯一的区别是SelectedItem还是SelectedValue是绑定的,但这与验证没有任何关系…我遇到了错误模板无法显示的确切问题,即使事件正在发生,我也无法理解为什么它只发生在某些控件上,而不发生在其他控件上
我最终找到的解决方法是将绑定的ValidationRule
上的ValidationStep
设置为ConvertedProposedValue
:
<TextBox>
<TextBox.Text>
<Binding Path="MyField">
<Binding.ValidationRules>
<Validation:MyValidationRule ValidationStep="ConvertedProposedValue" Message="Please enter a value." />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
不管怎么说,这似乎对我起了作用
编辑:如果您正在使用IDataErrorInfo,您可以尝试(尽管我还没有亲自测试):
i、 e.删除validatesOnDaerRors=True
,这只是包含单个
的快捷方式,我将检查以下内容:
- 检查组合框的datacontext和binding,如果它有效并且调用了IDataErrorInfo(我假设您进行了IDataErrorInfo验证)——下一步
- 将验证模板作为本地资源复制到ComboBox.Resources中,并检查其是否有效
尽管如此,如果您发布您的验证模板、组合框xaml和datacontext,这将是一件好事您能给我链接一些您是如何想到这一点的吗?我以前从未使用过手动验证规则!!!另外,消息应该来自数据(属性…),那么我如何填充它呢?我正在使用自己的类对System.Windows.Controls.ValidationRule进行子类化,以满足我的需要。如果您使用的是IDataErrorInfo,您可以尝试同样的方法(请参阅编辑的文章)。键入:
,我得到的异常:验证规则“System.Windows.Controls.DataErrorValidationRule”接收到意外值“”。(这可能是由于为规则分配了错误的ValidationStep造成的。)
tAver:我对SelectedValue而不是SelectedItem进行了绑定,可以正常工作。已经有一段时间了,但我认为这对SelectedItem不起作用(免责声明:我可能在这里想到其他东西-就像我说的已经有一段时间了)。就像这样:第一个检查肯定有效,第二个检查-我想它也有效,由于“不工作”组合框下的文本框可以看到模板…我在原始帖子中添加了我的进一步研究。仍然不走运:(你能上传一个解决问题的工作示例吗?你能用Snoop检查你在运行时的设置吗?Validation.ErrorTemplate ValueSource应该是你案例中的样式。我不能让你的代码工作,因为我错过了验证内容等等。