2014-02-16 138 views
0

我一直在试图将一个标签绑定到只读属性。我有一个更复杂的项目,我正在实施它,它不工作。我一直未能获得帮助,所以我创建了一个更简单的项目版本,并且我的数据绑定仍然没有更新。数据绑定不更新

要复制我的问题,您将需要一个带有文本框,标签和按钮的窗体,然后是一个类。

该类的代码如下


Imports System.ComponentModel 
Public Class databinding 
    Implements INotifyPropertyChanged 
    Public Sub New() 
     numbers = New List(Of number) 
    End Sub 
    Public Property numbers As List(Of number) 
     Get 
      Return m_number 
     End Get 
     Set(value As List(Of number)) 
      m_number = value 
      RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("hnumber")) 
     End Set 
    End Property 
    Private m_number As List(Of number) 
    Public ReadOnly Property hnumber As Integer 
     Get 
      Dim list As IList(Of number) = (From t As number In numbers Select t Order By t.value Descending).ToList() 
      If (list.Count > 0) Then 
       If (IsNothing(list(0).value)) Then 
        Return "0" 
       Else 
        Return list(0).value 
       End If 

      End If 
      Return "0" 
     End Get 

    End Property 

    Public Event PropertyChanged(sender As Object, e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged 
End Class 
Public Class number 
    Public Property value As Integer 
     Get 
      Return t_number 
     End Get 
     Set(value As Integer) 
      t_number = value 
     End Set 
    End Property 
    Private t_number As Integer 
End Class 

该窗体的代码如下:


Public Class Form1 
    Public numberlist As New databinding 
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     Label1.DataBindings.Add(New Binding("text", numberlist, "hnumber")) 
    End Sub 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     Dim newnum As New number 
     newnum.value = TextBox1.Text 
     numberlist.numbers.Add(newnum) 
    End Sub 
End Class 

现在根据我的理解,当你从文本框中单击该按钮数量被添加到这个列表中,发生这种情况,并且hnumber值更新,使用我可以看到的断点和手表也会发生。从阅读我需要实现inotifypropertychanged当我设置新号码以获取标签重新检查数据绑定(已完成)。

但是,标签将保持在0.如果我通过Label1运行手表,我可以在DataBindings> List> arrayList>(0)> System.Windows.Forms.Binding> DataSource> Databinding_test.databinding中查看细节类(包括hnumber的正确值)被列出,所以对我来说,这表明标签实际上知道它应该绑定的值。

有人可以请我填写我失踪的事情,使这一切工作,因为它几乎使我拔出我所有的头发。

感谢, MTG

回答

1

我已经尝试过解释这个给你,我会试。

您的绑定未更新的原因是您将值添加到列表中。

numberlist.numbers.Add(newnum) 

但是,如果您“更改”列表,这将触发propertychanged事件。

numberlist.numbers.Add(newnum) 
numberlist.numbers = numberlist.numbers '<-- 

而不是使用IList<T>你应该使用ObservableCollection<T>它允许你跟踪所做的改动。

Public Class databinding 
    Implements INotifyPropertyChanged 

    Public Sub New() 
     Me.numbers = New ObservableCollection(Of number) 
    End Sub 

    Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged 

    Public Property numbers As ObservableCollection(Of number) 
     Get 
      Return m_number 
     End Get 
     Set(value As ObservableCollection(Of number)) 
      If (Not m_number Is value) Then 
       Unhook(m_number) 
       Hook(value) 
       m_number = value 
       RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("hnumber")) 
      End If 
     End Set 
    End Property 

    Public ReadOnly Property hnumber As Integer 
     Get 
      If (Not numbers Is Nothing) Then 
       Dim list As IList(Of number) = (From t As number In numbers Select t Order By t.value Descending).ToList() 
       If (list.Count > 0) Then 
        If (IsNothing(list(0).value)) Then 
         Return 0 
        Else 
         Return list(0).value 
        End If 
       End If 
      End If 
      Return 0 
     End Get 
    End Property 

    Private Sub Hook(collection As ObservableCollection(Of number)) 
     If (Not collection Is Nothing) Then 
      AddHandler collection.CollectionChanged, AddressOf Me.OnNumbersChanged 
     End If 
    End Sub 

    Private Sub OnNumbersChanged(sender As Object, e As NotifyCollectionChangedEventArgs) 
     RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("hnumber")) 
    End Sub 

    Private Sub Unhook(collection As ObservableCollection(Of number)) 
     If (Not collection Is Nothing) Then 
      RemoveHandler collection.CollectionChanged, AddressOf Me.OnNumbersChanged 
     End If 
    End Sub 

    Private m_number As ObservableCollection(Of number) 

End Class