2011-12-02 104 views
0

我有一個類,代表了一些業務對象,比如這個:如何驗證.NET集合的對象?

Public Class MyObject 
    Inherits SomeBaseObject ' Implements INotifyPropertyChanged and IDataErrorInfo 

    Private mMyVariable as Integer 
    Public Property MyVariable as Integer 
     Get 
      Return mMyVariable 
     End Get 
     Set(ByVal value as Integer) 
      mMyVariable = value 
      OnPropertyChanged("MyVariable") 
      Validate() 
     End Set 
    End Property 

    Private Sub Validate() 
     ' Validate fields and set IDataInfoError errors as needed. 
    End Sub 

End Class 

SomeBaseObject同時實現了INotifyPropertyChanged的和IDataErrorInfo的,這樣設置的屬性值時,驗證方法將填充適當IDataErrorInfo的領域。

我也有一個支持更改事件的集合,我最終綁定到WPF DataGrid。

Public Class MyCollection 
    Inherits ObservableCollection(Of MyObject) 
End Class 

第1部分:比方說,我有一個商業規則,它說,我的收藏中沒有兩個項目可能有MyVariable相同的值。當集合中的任何項目的屬性值發生更改時,如何設置我的事件(或在某處實現其他接口)以執行此交叉項目驗證?

第2部分:假設我有一列整數這樣,每當我添加一個新的MyObject項目的MyCollection實例或改變任何項目MyVariable物業已經在徵收時,MyVariable屬性的值必須存在於這個整數列表中嗎?

回答

1

對此的一種可能的選擇是使用特定的add方法(如AddRecord)將所有記錄添加到集合中,如果它們合法添加它們。

(使用這種新方法的唯一原因是優雅地處理嘗試添加新記錄的場景,但這種嘗試應該被拒絕;另一種方法是重寫InsertItem並在規則時拋出異常)

將記錄添加到集合時,可以將集合中的事件偵聽器連接到INotifyPropertyChanged.OnPropertyChanged事件,以便偵聽對MyVariable屬性的更改。不幸的是,現在唯一的選擇是在遇到重複時拋出異常,但這總比沒有好。

您可以重寫ObservableCollections Remove方法以刪除事件偵聽器並確保已刪除的對象可以被垃圾收集。

希望這會給你一些關於如何解決你的問題的想法。

+0

這讓我朝着正確的方向思考。當新項目添加到集合中時,我爲每個項目綁定了一個Property_Changed事件處理程序,並且在事件處理程序中,我檢查了該對象的唯一性,並在檢查失敗時將其標記爲無效。它不會阻止用戶添加副本,但將新對象標記爲無效可防止在用戶修復問題之前保存數據。 –