Как сделать привязку данных для пользовательского элемента управления? - PullRequest
0 голосов
/ 02 февраля 2019

Я создаю пользовательский элемент, для которого мне нужно создать привязку данных.

Давайте рассмотрим следующий класс.Для простоты давайте использовать TextControl.(Реальный элемент, который я создаю, не содержит никакого текстового элемента управления. Это только для тестирования)

Public Class GIce
    Implements IBindableComponent
    Implements INotifyPropertyChanged

    'The control used only for testing. (I'm avoiding making the object GIce inherit from the TextControl to make sure no interface is already implemented)
    Public TextEdit As TextEdit

    'Constructor
    Public Sub New()
        Me.TextEdit = New TextEdit
    End Sub

    'The main property to be used for data binding
    Property Content
        Get
            Return Me.TextEdit.Text
        End Get
        Set(value)
            If IsDBNull(value) Then
                Me.TextEdit.Text = ""
            Else
                Me.TextEdit.Text = value
            End If

            RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("Content"))
        End Set
    End Property

    'Binding context
    Private BindingContext_ As BindingContext
    Public Property BindingContext As BindingContext Implements IBindableComponent.BindingContext
        Get
            If IsNothing(Me.BindingContext_) Then
                Me.BindingContext_ = New BindingContext
            End If

            Return Me.BindingContext_
        End Get
        Set(value As BindingContext)
            Me.BindingContext_ = value
        End Set
    End Property

    'Databindings
    Private DataBindings_ As ControlBindingsCollection
    Public ReadOnly Property DataBindings As ControlBindingsCollection Implements IBindableComponent.DataBindings
        Get
            If IsNothing(Me.DataBindings_) Then
                Me.DataBindings_ = New ControlBindingsCollection(Me)
            End If

            Return Me.DataBindings_
        End Get
    End Property

    'Property changed event
    Public Event PropertyChanged(sender As Object, e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged

    Public Property Site As System.ComponentModel.ISite Implements System.ComponentModel.IComponent.Site

    'Disposing support
    Public Event Disposed(sender As Object, e As EventArgs) Implements System.ComponentModel.IComponent.Disposed
#Region "IDisposable Support"
    ...
#End Region

    'Unimportant property. Used only for testing
    Public Property Parent
        Get
            Return TextEdit.Parent
        End Get
        Set(value)
            TextEdit.Parent = value
        End Set
    End Property

    'Unimportant property. Used only for testing
    Public Property Location
        Get
            Return TextEdit.Location
        End Get
        Set(value)
            TextEdit.Location = value
        End Set
    End Property    
End Class

Затем я использую этот объект в такой форме:

Public Class Form3
    Dim DataTable As DataTable      
    Dim GIce As GIce

    Public Sub New()                        
        GIce = New GIce
        GIce.parent = Me
        GIce.location = New Point(50, 50)
    End Sub

    Private Sub Form3_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        DataTable = GetDataTable() 'Basically datatable has two columns C1 and C2 and filled with string data in several rows

        'Create the binding
        Me.TextEdit1.DataBindings.Add(New Binding("Text", DataTable, "C1")) 'This control is created to make sure binging works and the datanavigator moves properly the position of the currency manager
        Me.GIce.DataBindings.Add(New Binding("Content", DataTable, "C2"))

        'Create the data navigator
        Me.DataNavigator1.DataSource = DataTable        
    End Sub
end class

При выполнении привязка на моем пользовательском элементе управления не работает.Если я перемещу позицию менеджера валют с помощью Навигатора данных, значение, содержащееся в моем элементе управления, не изменится.Также при вводе чего-либо вручную в элемент управления изменение не отражается в таблице данных.

У кого-нибудь есть идеи, почему оно не работает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...