Silverlight忽略[Required] Data注释

时间:2013-02-22 19:56:31

标签: silverlight c#-4.0 data-annotations

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

我的[必需]和长度数据注释不想进入我的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设置为自动加载false,查询参数绑定到FooID文本框。最初,当有人加载表单时,我将数据上下文设置为我的DDS,在这种情况下我不会在DDS上执行加载操作,因为用户选择他们正在创建一个&#34; New Foo&#34;记录。因此,此时DataView.CurrentItem为null。这就是发生的事情:

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

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

这里发生了什么?我还是一个非常新的开发人员,他更像是一个终生的DBA(现在只有一年时间开发SL解决方案)而我刚开始在我的课程中使用验证器而不是穷人在代码隐藏和按钮中的验证点击事件等但是,无法在google / bing中找到大量有关此类问题的信息。任何见解都表示赞赏。我确定我可能会采取错误的方式。

1 个答案:

答案 0 :(得分:1)

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

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

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