我有一个模板,用于显示红色边框和控件周围的错误消息。它工作(在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是否被绑定,但是验证不应该有任何影响......
答案 0 :(得分:1)
我遇到了错误模板没有显示的确切问题,即使事件正在发生,并且永远无法弄清楚为什么它只发生在某些控件而不是其他控件上。
我最终找到的解决方法是在ValidationStep
上为绑定设置ConvertedProposedValue
到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>
即。删除ValidatesOnDataErrors=True
,这只是包含单个<DataErrorValidationRule />
答案 1 :(得分:0)
我会检查以下内容:
然而,如果你发布你的验证模板,你的组合框xaml和你的datacontext
那将是件好事。