2012-10-29 120 views
0

我有一些連接到一起的Linq to SQL表類。我目前使用LINQ to SQL查詢綁定到treeview。它可以工作,但不會顯示何時從數據庫中添加或刪除東西。Linq to SQL to ObservableCollection for treeview in VB.Net

我實現了INotifyPropertyChanged,但它沒有更新treeview。

我也試過使用Bindable Linq,但它似乎沒有區別。

我發現了一個方法來創建ObservableCollections而不必創建更多類的示例:jimlynn.wordpress.com/2008/12/09/using-observablecollection-with-linq/(這很重要,因爲我有一個未來的項目迫近,需要與很多表交互(30個左右),只是創建Linq到SQL類將是一個痛苦)。

Property ModelQuery As ObservableCollection(Of dbModels) = New ObservableCollection(Of dbModels)().PopulateFrom(From mm In tblModels.AsBindable Order By mm.ModelName) 

這是一個很好的路要走,還是我將不得不創建一個單獨的ObservableCollection和代碼維護他們倆。如果我要使用這種綁定的東西,我真的想要一種方法來將東西鏈接在一起,所以無需在更改時更新多個結構。

主表:

<Table(Name:="Models")> Public Class dbModels 
    Implements INotifyPropertyChanged 
    Private _changed As Boolean 
    Public Event PropertyChanged(ByVal sender As Object, ByVal e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged 
    Protected Overridable Sub OnPropertyChanged(ByVal Propertyname As String) 
     If Not Propertyname.Contains("Changed") Then 
      Changed = True 
     End If 
     RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(Propertyname)) 
    End Sub 
    Public Property Changed() As Boolean 
     Get 
      Return _changed 
     End Get 
     Set(ByVal value As Boolean) 
      If _changed <> value Then 
       _changed = value 
       OnPropertyChanged("Changed") 
      End If 
     End Set 
    End Property 

    Private _ModelID As Integer 
    <Column(Storage:="_ModelID", DbType:="int IDENTITY NOT NULL", IsPrimaryKey:=True, IsDbGenerated:=True, Name:="ModelID")> _ 
    Public Property ModelID() As Integer 
     Get 
      Return Me._ModelID 
     End Get 
     Set(value As Integer) 
      Me._ModelID = value 
     End Set 
    End Property 

    Private _ModelName As String 
    <Column(Storage:="_ModelName", DbType:="Varchar(200)", Name:="ModelName")> _ 
    Public Property ModelName() As String 
     Get 
      Return Me._ModelName 
     End Get 
     Set(value As String) 
      Me._ModelName = value 
     End Set 
    End Property 

    Private _ModelYears As EntitySet(Of dbModelYears) = New EntitySet(Of dbModelYears) 
    <Association(Storage:="_ModelYears", DeleteRule:="CASCADE", OtherKey:="ModelID")> _ 
    Public Property ModelYears As EntitySet(Of dbModelYears) 
     Get 
      Return _ModelYears 
     End Get 
     Set(value As EntitySet(Of dbModelYears)) 
      _ModelYears.Assign(value) 
     End Set 
    End Property 

End Class 

連接表:

<Table(Name:="ModelYears")> Public Class dbModelYears 
    Implements INotifyPropertyChanged 
    Private _changed As Boolean 
    Public Event PropertyChanged(ByVal sender As Object, ByVal e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged 
    Protected Overridable Sub OnPropertyChanged(ByVal Propertyname As String) 
     If Not Propertyname.Contains("Changed") Then 
      Changed = True 
     End If 
     RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(Propertyname)) 
    End Sub 
    Public Property Changed() As Boolean 
     Get 
      Return _changed 
     End Get 
     Set(ByVal value As Boolean) 
      If _changed <> value Then 
       _changed = value 
       OnPropertyChanged("Changed") 
      End If 
     End Set 
    End Property 

    Private _ModelYearID As Integer 
    <Column(Storage:="_ModelYearID", DbType:="int IDENTITY NOT NULL", IsPrimaryKey:=True, IsDbGenerated:=True, Name:="ModelYearID")> _ 
    Public Property ModelYearID() As Integer 
     Get 
      Return Me._ModelYearID 
     End Get 
     Set(value As Integer) 
      Me._ModelYearID = value 
     End Set 
    End Property 

    Private _ModelID As Integer 
    <Column(Storage:="_ModelID", DbType:="int", Name:="ModelID")> _ 
    Public Property ModelID() As Integer 
     Get 
      Return Me._ModelID 
     End Get 
     Set(value As Integer) 
      Me._ModelID = value 
     End Set 
    End Property 

Private _ModelYear As String 
    <Column(Storage:="_ModelYear", DbType:="Varchar(50)", Name:="ModelYear")> _ 
    Public Property ModelYear() As String 
     Get 
      Return Me._ModelYear 
     End Get 
     Set(value As String) 
      Me._ModelYear = value 
     End Set 
    End Property 

End Class 

回答

0

實施INotifyPropertyChanged或使用ObservableCollection不會通知您在數據庫中的變化。每次您想要從數據庫中檢索新數據時,您都必須執行查詢。
或者,您可以使用SqlDependency在您的應用程序和SQL Server實例之間設置查詢通知依賴關係。

編輯:
從評論。
連接集合中項目的PropertyChanged事件。

For Each item As var In itemsCollection 
    Dim notifyItem = TryCast(item, INotifyPropertyChanged) 
    If item IsNot Nothing Then 
     AddHandler notifyItem.PropertyChanged, AddressOf ItemChanged 
    End If 
Next 

Public Sub ItemChanged(sender As Object, e As PropertyChangedEventArgs) 
    'Handle event 
End Sub 
+0

這是否意味着它不會通知我,如果我做的,我運行的實例的變化,或者說如果別人做出改變,從另一臺計算機的數據庫也不會通知我?如果我觸發在課堂上更改的屬性,是否有理由不會看到更改? – AndyD273

+0

它不會通知您數據庫中所做的更改。如果你在內存中修改了ObservableCollection,它會通知你。 – Magnus

+0

那是不是有沒有通知我的原因呢?如果更改是在與一個實體集合連接的子類中進行的,它會有所作爲嗎? – AndyD273