僅供參考:在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中找不到很多關於這類問題的信息。任何見解都會被讚賞。我相信我可能會以某種錯誤的方式去做。