直到最近,我一直在使用自定义扩展版的IDataErrorInfo
界面。我的扩展使我能够同时处理多个错误,到目前为止,它对我很有帮助。但是,随着INotifyDataErrorInfo
界面的引入,我想我会尝试一下,看看是否有任何改进。
在遵循了一些在线教程之后,我得到了它ValidationAttribute
与System.ComponentModel.DataAnnotations namespace
. 使用这些Attribute
s,您可以提供如下基本验证规则:
[MinLength(3, ErrorMessage = "Name must be longer than 3 characters.")]
public string Name
{
get { return name; }
set { name = value; NotifyPropertyChanged("Name"); Validate("Name", name); }
}
最初,它看起来相当不错,因为错误消息直接插入到应用sValaidation.Errors
中可用的集合中。ErrorTemplate
但是,大多数内置验证规则都是非常基础的,我习惯于必须实现涉及其他属性值的复杂验证规则。
因此,我着手寻找一种方法来创建涉及多个属性的简单验证规则:必须设置两个或多个字段之一的规则。所以我声明了一个扩展的类,ValidationAttribute
在网上搜索后,找到了一种访问其他属性值的方法。
我敲开了一个基本 UI,其中ErrorTemplate
每个都应用了自定义TextBox
,它显示Validation.Errors
了数据绑定属性的集合:
<ControlTemplate x:Key="ErrorTemplate">
<StackPanel Orientation="Horizontal">
<Border BorderBrush="#4FFF0000" BorderThickness="1" Margin="0,10">
<AdornedElementPlaceholder />
</Border>
<Image Name="WarningImage" Source="pack://application:,,,/WpfApplication1;component/Images/Warning_16.png" Margin="5,0,0,0" Tag="{Binding}" />
<Popup PlacementTarget="{Binding ElementName=WarningImage}" Placement="Right" Margin="5,0,0,0" AllowsTransparency="True" IsOpen="True">
<Border BorderThickness="1" BorderBrush="#4FFF0000" CornerRadius="5" Background="White" Padding="5" Margin="10">
<Border.Effect>
<DropShadowEffect Color="Red" Opacity="0.5" BlurRadius="15" ShadowDepth="0" />
</Border.Effect>
<ItemsControl ItemsSource="{Binding}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding ErrorContent}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Border>
</Popup>
</StackPanel>
</ControlTemplate>
使用我Attribute
对属性的自定义设置,当两个属性都未设置时Name
,我设法通过接口将 a 添加ValidationResult
到Validation.Errors
集合中,但问题是:如果我将值添加到TextBox
绑定到其他必需属性的其他 es 数据之一中,则第一个错误消息TextBox
会留在那里。
如果我回到第一个TextBox
并输入一些内容,那么验证将起作用,因此即使我删除了该值,它仍然知道设置了一个必需的属性。所以验证代码有效,但问题是对其他必需属性的属性更改不会触发属性中的验证Name
。
即使我将相同的自定义Attribute
应用于其他必需的属性,同样的事情也发生了……每个验证错误只有在输入相关的TextBox
. 我还尝试了CustomValidationAttribute
使我们能够调用类中的方法进行验证的内置方法,但最终结果是相同的。
验证代码有效,但不会从其他必需的属性更改中触发。我什至尝试调用该Validate
方法,传入其他属性的名称,但这以连续循环结束。所以问题是,当另一个属性被验证时,如何触发对一个属性的验证?