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,但这与验证没有任何关系...
我遇到了确切的问题,即使事件正在触发,错误模板也不会显示,并且永远无法弄清楚为什么它只发生在某些控件而不是其他控件上。
我最终找到的解决方法是将绑定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>
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 />