2013-02-22 105 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" });