仅供参考:在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中找不到很多关于这类问题的信息。任何见解都会被赞赏。我相信我可能会以某种错误的方式去做。