0

我有一些连接在一起的 Linq to SQL 表类。我目前仅使用 LINQ to SQL 查询将其绑定到树视图。它可以工作,但它不显示何时从数据库中添加或删除内容。

我实现了 INotifyPropertyChanged 但它没有更新树视图。

我也尝试过使用 Bindable Linq,但似乎没有什么不同。

我找到了一个无需创建更多类即可轻松创建 ObservableCollections 的示例:jimlynn.wordpress.com/2008/12/09/using-observablecollection-with-linq/,(这很重要,因为我有未来项目迫在眉睫,需要与大量表(30 个左右)进行交互,并且仅创建 Linq to 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
4

1 回答 1

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
于 2012-10-29T20:47:21.070 回答