0

仅供参考:在 VS 2012 Ultimate 中使用 .NET 4.5 和 Silverlight 5。

我的 [Required] 和 Length 数据注释不想冒泡到我的 Silverlight 表单中并进行验证。我有一个通过 DDS 公开的相当直接的课程。例子:

public class FooCard : INotifyPropertyChanged
{
    [Key]
    [Required]
    [IntegerValidator(MinValue = 0, MaxValue = 32768)]
    public short FooID { get; set; }

    [Required]
    [StringLength(15)]
    public string FooName { get; set; }

我的 XMAL 看起来像这样:

<TextBlock Height="25" Text="FooID:" Grid.Row="1" Grid.Column="0" HorizontalAlignment="Right"
                                Margin="0,0,2,0">
</TextBlock>
<TextBox Name="TextBox_FooID" Text="{Binding Path=FooID, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Grid.Row="1" Grid.Column="1" TextChanged="TextBox_TextChanged">
</TextBox>
<TextBlock Height="25" Text="Foo Name:" Grid.Row="2" Grid.Column="0" HorizontalAlignment="Right"
                                    Margin="0,0,2,0">
</TextBlock>
<TextBox Name="TextBox_FooName" Text="{Binding Path=FooName, Mode=TwoWay, ValidatesOnExceptions=True, NotifyOnValidationError=True, UpdateSourceTrigger=PropertyChanged}" Grid.Row="2" Grid.Column="1"
                             TextChanged="TextBox_TextChanged"
                             LostFocus="TextBox_FooName_LostFocus">

DDS 设置为 auto load false 并且查询参数绑定到 FooID 文本框。最初,当有人加载表单时,我将数据上下文设置为我的 DDS,并且在这种情况下我没有在 DDS 上执行加载操作,因为用户选择他们正在创建“新 Foo”记录。因此,此时 DataView.CurrentItem 为空。这就是正在发生的事情:

如果用户开始在带有 FooID 等注释的绑定字段中键入内容,它会立即仅在该字段上运行任何注释验证器。出现一个红色框,表示最小长度。但是,在我的示例中,没有任何东西可以验证其他绑定属性,例如 FooName 。我实际上可以使用空的 fooName 提交更改,并引发验证错误异常。当然,我将保存更改按钮绑定到我的 DDS 的 HasValidationErrors 属性,所以这不会发生在用户身上。但是,用户对为什么禁用保存更改按钮感到困惑,并且没有红色框要求他们在 fooName 中输入内容。我当然可以创建一个标签或将 * 放在框旁边,表明它是必需的。

但是,我可以通过加载 FooName = " "; 来解决这个问题。FooName = string.empty; 在 OnNavigatedTo 的代码隐藏中。一旦它加载空间然后再次设置为空字符串,它就会显示为一个红色框。这几乎就像 Silverlight 要求首先初始化每个属性或其他东西。这似乎是一个彻底的黑客攻击,我讨厌要求我表单上的 50 多个文本框都设置为一些虚假的初始值并再次返回。IE。这不是一个解决方案,而是一个故障排除步骤。

这里发生了什么?我仍然是一个相当新的开发人员,他更像是一名终身 DBA(现在只有一年的时间来开发 SL 解决方案),我刚刚开始在我的课程中使用验证器,而不是在代码隐藏和按钮点击事件等中使用穷人的验证。但是,在 google / bing 中找不到很多关于发生此类问题的信息。任何见解都值得赞赏。我确定我可能会以错误的方式进行操作。

4

1 回答 1

1

问题是 DataAnnotations 的验证仅在 Property Setter 中触发,然后绑定引擎仅在通过绑定调用 Setter 时才会选择它。如果要显示所有属性的验证错误,则必须实现INotifyDataErrorInfo

实现此接口后,您可以随时从代码中设置验证错误。如果有帮助,您还可以使用 Validator 类来获取每个属性的验证错误,例如:

Validator.ValidateProperty(valueToValidate, 
    new ValidationContext(this, null, null) { MemberName = "MyProperty" } );
于 2013-02-23T12:29:01.343 回答