2013-02-22 82 views
0

仅供参考:在VS 2012 Ultimate中使用.NET 4.5和Silverlight 5。Silverlight忽略[Required]数据注释

我的[必填]和长度数据注释不想布置到我的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设置为自动加载虚假和查询参数绑定到FooID文本框。最初,当有人加载表单时,我将数据上下文设置为我的DDS,在这种情况下,我不会在DDS上执行加载操作,因为用户选择他们正在创建“New Foo”记录。所以,DataView.CurrentItem在这一点上是空的。发生了什么事情:

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

但是,我可以通过加载FooName =“”; FooName = string.empty;在OnNavigatedTo的代码隐藏中。一旦它加载空间,然后再次设置为空字符串,它将显示一个红色框。这几乎就像Silverlight要求每个属性首先被初始化。这看起来像一个彻头彻尾的黑客,我不想要求我的表单上的50+文本框都设置为一些虚假的初始值,然后再返回。即。这不是解决方案,而是一个故障排除步骤。

这是怎么回事?我仍然是一个非常新的开发人员,他更像一个终身DBA(仅在开发SL解决方案的一年内),我刚开始在我的类中使用验证程序,而不是穷人在代码隐藏和按钮单击事件等方面的验证。但是,在google/bing中找不到很多关于这类问题的信息。任何见解都会被赞赏。我相信我可能会以某种错误的方式去做。

回答

1

问题是DataAnnotations的验证只在属性设置器中触发,然后绑定引擎只会在通过绑定调用Setter时才会启动它。如果要显示所有属性的验证错误,则必须执行INotifyDataErrorInfo

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

Validator.ValidateProperty(valueToValidate, 
    new ValidationContext(this, null, null) { MemberName = "MyProperty" });