2011-12-19 21 views
1

我試圖設置一個標誌,當一個集合被修改 - 合乎邏輯的地方,似乎是在setter方法中。問題是,當我使用此代碼爲什麼在使用.Add時setter未被訪問?

setterDemo1.Widgets.Add(new Widget) 

m_widgetSetterVisited未設置爲True。 有沒有人看到我在這裏失蹤?訪問其成員不是當 - 設置List(Of Widget)本身時 謝謝, 戴夫

Public Class SetterDemo 

    Private m_Widgets As List(Of Widget) = New List(Of Widget) 
    Public m_widgetSetterVisited As Boolean = False 

    Public Property Widgets() As List(Of Widget) 
     Get 
      Return m_Widgets 
     End Get 
     Set(ByVal value As List(Of Widget)) 
      m_widgetSetterVisited = True 
      m_Widgets = value 
     End Set 
    End Property 

End Class 

Public Class Widget 

    Public Name As String 
    Public Age As Integer 

End Class 

回答

1

你的代碼只改變你的m_widgetSetterVisited標誌。所以,你需要這樣的代碼來觸發它:

setterDemo.Widgets = New List(Of Widget) 

setterDemo.Widgets = OtherWidgetObject 

只需操縱該引用將無法正常工作的成員。

+0

我有興趣在應對任何人誰標誌着這個答案是沒有幫助的想法。 :) – 2011-12-19 01:44:20

2

在您的示例代碼中,您正在對字段執行get,然後調用List類型的返回對象上的方法。請注意,您從不設置字段m_Widgets的值。總之,這是行不通的。

我覺得來完成你想做的事情,你需要無論是從一個類中System.Collections.ObjectModel命名空間中繼承(或List如果這是不可能的),並覆蓋添加的各種方法和刪除成員,或封裝List什麼並自行實施IList,根據需要調度到內部列表。或者,您可以使用在添加/刪除對象時觸發事件的ObservableCollection

編輯 - Incorperating基甸的注意要使用System.ObjectModel.Collection如果可能的話

+0

非常感謝,我會看看所有這些優秀的答案。我會認爲這個setter會被調用,因爲通過添加一個新成員,我正在改變.Widgets的價值,並因此寫入它。 – JollySwagman 2011-12-19 02:17:39

+1

'List'不是首選的基類(儘管可能存在可能需要這種方法的外部問題)。在進行集合時,您應該從'System.ObjectModel.Collection'派生。 – 2011-12-19 02:49:22

1

您可以使用它支持IList<T>接口的ObservableCollection同時還支持集合更改通知:

Imports System.Collections.ObjectModel 
Imports System.Collections.Specialized 

Public Class ChangedDemo 

    Private m_Widgets As ObservableCollection(Of Widget) = New ObservableCollection(Of Widget) 
    Public m_WidgetsChanged As Boolean = False 

    Public Sub New() 
     AddHandler m_Widgets.CollectionChanged, AddressOf m_Widgets_CollectionChanged 
    End Sub 

    Private Sub m_Widgets_CollectionChanged(ByVal sender As Object, ByVal e As NotifyCollectionChangedEventArgs) 
     m_WidgetsChanged = True 
    End Sub 

    Public ReadOnly Property Widgets() As IList(Of Widget) 
     Get 
      Return m_Widgets 
     End Get 
    End Property 

End Class 
相關問題