views:

80

answers:

0

I have a problem with a bound user control writing back to it's datasource on a NetCF forms application. The application is too complex to post code, so I made a toy version to show you.

  • I create a form, usercontrol with a combobox, a class (testBind) and another class (TestLookup).
  • I bind a property of the usercontrol ("value") to a property ("selectedValue") on the testBind class. The testBind class implements INotifyPropertyChanged.
  • I create a few fascade methods on the user control to bind the contained combobox to a BindingList(of TestLookup).
  • I create a button to show the value of the testBind bound property (in a MessageBox).

The messagebox returns "-1" every time regardless of the combobox entry selected. I can take the EXACT same code, paste it in a full framework Forms app and it will return the correct value of the selected combobox entry.

Imports System.ComponentModel

Public Class Form2 Inherits Form

Private _testBind1 As testBind
Private _testUserControlX As UserControlX
Friend WithEvents _buttonX As System.Windows.Forms.Button
Public Sub New()
    _buttonX = New System.Windows.Forms.Button
    _buttonX.Location = New System.Drawing.Point(126, 228)
    _buttonX.Size = New System.Drawing.Size(70, 21)
    _testBind1 = New testBind
    _testUserControlX = New UserControlX()

    Dim _lookup As New System.ComponentModel.BindingList(Of TestLookup)()
    _lookup.Add(New TestLookup(1, "text1"))
    _lookup.Add(New TestLookup(2, "text2"))

    _testUserControlX.DataSource = _lookup
    _testUserControlX.DisplayMember = "Text"
    _testUserControlX.ValueMember = "ID"
    _testUserControlX.DataBindings.Add("Value", _testBind1, "SelectedID", False, DataSourceUpdateMode.OnValidation)

    MinimizeBox = False

    Controls.Add(_testUserControlX)
    Controls.Add(_buttonX)

End Sub

Private Sub ButtonX_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles _buttonX.Click
    MessageBox.Show(_testBind1.SelectedID.ToString())
End Sub


Public Class testBind
    Implements System.ComponentModel.INotifyPropertyChanged

    Private _selectedRow As Integer = -1

    Public Event PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged

    Protected Sub OnPropertyChanged(ByVal PropertyName As String)
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(PropertyName))
    End Sub

    Public Property SelectedID() As Integer
        Get
            Return _selectedRow
        End Get
        Set(ByVal value As Integer)
            _selectedRow = value
            OnPropertyChanged("SelectedID")
        End Set
    End Property
End Class

Public Class TestLookup
    Private _text As String
    Private _id As Integer
    Public Sub New(ByVal id As Integer, ByVal text As String)
        _text = text
        _id = id
    End Sub
    Public Property ID() As Integer
        Get
            Return _id
        End Get
        Set(ByVal value As Integer)
            _id = value
        End Set
    End Property
    Public Property Text() As String
        Get
            Return _text
        End Get
        Set(ByVal value As String)
            _text = value
        End Set
    End Property
End Class

End Class

Public Class UserControlX Inherits System.Windows.Forms.UserControl

Friend WithEvents ComboBox1 As System.Windows.Forms.ComboBox
Public Sub New()
    Me.ComboBox1 = New System.Windows.Forms.ComboBox
    Me.Controls.Add(Me.ComboBox1)
End Sub

Public Property Value() As Integer
    Get
        Return ComboBox1.SelectedValue
    End Get
    Set(ByVal value As Integer)
        ComboBox1.SelectedValue = value
    End Set
End Property


Public Property DataSource() As Object
    Get
        Return ComboBox1.DataSource
    End Get
    Set(ByVal value As Object)
        ComboBox1.DataSource = value
    End Set
End Property


Public Property ValueMember() As String
    Get
        Return ComboBox1.ValueMember
    End Get
    Set(ByVal value As String)
        ComboBox1.ValueMember = value
    End Set
End Property


Public Property DisplayMember() As String
    Get
        Return ComboBox1.DisplayMember
    End Get
    Set(ByVal value As String)
        ComboBox1.DisplayMember = value
    End Set
End Property

End Class