2014-02-16 3 views
0

readonly 속성에 대한 databind 레이블을 가져 오려고했습니다. 나는 이것을 구현하고있는 훨씬 복잡한 프로젝트를 가지고 있으며 작동하지 않는다. 나는이 프로젝트에 훨씬 더 단순한 버전을 만들었고 내 데이터 바인딩은 여전히 ​​업데이트되지 않도록이 작업에 도움을 얻지 못했습니다.데이터 바인딩이 업데이트되지 않습니다.

내 문제를 복제하려면 텍스트 상자, 레이블 및 버튼이 포함 된 양식과 클래스가 필요합니다.


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을 통해 감시를 실행하면 해당 데이터 바인딩> 목록> arrayList> (0)> System.Windows.Forms.Binding> DataSource> Databinding_test.databinding 클래스 (hnumber에 대한 올바른 값 포함)가 나열되어 있으므로 Label이 실제로 바인딩해야하는 값을 알 수 있음을 보여줍니다.

누구나 내가이 모든 일을하기 위해 놓친 것에 대해 저를 채워 주시겠습니까? 거의 모든 것이 제 머리카락을 꺼내게 만듭니다.

감사합니다, MTG는

답변

1

내가 전에 당신에게 이것을 설명하려고했습니다, 나는 다시 것입니다.

바인딩을 업데이트하지 않는 이유는 값을 목록에 추가하기 때문입니다.

numberlist.numbers.Add(newnum) 

그러나 목록을 "변경"하면 속성 변경 이벤트가 트리거됩니다. 대신 변경 사항을 추적 할 수있는 ObservableCollection<T>를 사용해야합니다 IList<T>를 사용

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

.

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 
관련 문제