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しても、データベースの変更が通知されません。データベースから新しいデータを取得するたびに、クエリを実行する必要があります。または、アプリケーションと SQL Server のインスタンス間のクエリ通知の依存関係を設定するために
使用することもできます。SqlDependency

編集:
コメントから。コレクション内のアイテムのイベント
をフックします。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 に答える