2014-01-06 3 views
0

데이터 바인딩 된 텍스트 값을 업데이트하는 레이블에 문제가 있습니다. 운동 선수의 최고 던지기를 계산하는 클래스가 있는데이 클래스는 내 양식의 레이블에 바인딩되어 있습니다.VB.NET 데이터 바인딩 된 레이블이 업데이트되지 않습니다.

Imports System.ComponentModel 
Imports System.Runtime.CompilerServices 

Public Class Competition 
    Public Sub New() 
     Competitors = New List(Of Competitor)() 
    End Sub 
    Public Property Competitors() As List(Of Competitor) 
     Get 
      Return m_Competitors 
     End Get 
     Set(value As List(Of Competitor)) 
      m_Competitors = value 
     End Set 
    End Property 
    Private m_Competitors As List(Of Competitor) 
    Public ReadOnly Property CurrentPlacings() As List(Of Competitor) 
     Get 
      Return Competitors.OrderByDescending(Function(c) c.BestThrow).ToList() 

     End Get 
    End Property 

End Class 
Public Class Competitor 
    Implements System.ComponentModel.INotifyPropertyChanged 
    Public Event PropertyChanged(sender As Object, 
      e As System.ComponentModel.PropertyChangedEventArgs) _ 
      Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged 
    Public Sub New() 
     Throws = New List(Of [Throw])() 
    End Sub 
    Public Property FirstName() As String 
     Get 
      Return m_FirstName 
     End Get 
     Set(value As String) 
      m_FirstName = value 
     End Set 
    End Property 
    Private m_FirstName As String 
    Public Property LastName() As String 
     Get 
      Return m_LastName 
     End Get 
     Set(value As String) 
      m_LastName = value 
     End Set 
    End Property 
    Private m_LastName As String 
    Public Property compNumber() As String 
     Get 
      Return m_compNumb 
     End Get 
     Set(value As String) 
      m_compNumb = value 
     End Set 
    End Property 
    Private m_compNumb As String 
    Public Property club() As String 
     Get 
      Return m_club 
     End Get 
     Set(value As String) 
      m_club = value 
     End Set 
    End Property 
    Private m_club As String 
    Public Property Throws() As List(Of [Throw]) 
     Get 
      Return m_Throws 
     End Get 
     Set(value As List(Of [Throw])) 
      m_Throws = value 
     End Set 
    End Property 
    Private m_Throws As List(Of [Throw]) 
    Public ReadOnly Property BestThrow() As Object 
     Get 
      Dim bt = Throws.Where(Function(t) t.Status = ThrowStatus.Valid).OrderByDescending(Function(t) t.Distance).First() 
      If (IsNothing(bt.Distance)) Then 
       bt.Distance = "0" 
      End If 
      RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("BestThrow")) 
      Return bt 

     End Get 
    End Property 
    Public ReadOnly Property getLabel 
     Get 
      Return compNumber & " " & LastName & ", " & FirstName & vbCrLf & club 
     End Get 
    End Property 

End Class 
Public Enum ThrowStatus 
    Valid 
    Pass 
    Foul 
End Enum 
Public Class [Throw] 
    Implements INotifyPropertyChanged 
    Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged 

    Public Property Status() As ThrowStatus 
     Get 
      Return m_Status 
     End Get 
     Set(value As ThrowStatus) 
      m_Status = value 
     End Set 
    End Property 
    Private m_Status As ThrowStatus 
    Public Property Distance() As String 
     Get 
      If Status = ThrowStatus.Valid Then 
       If (m_Distance > 0) Then 
        Return m_Distance 
       Else 
        Return Nothing 
       End If 

      ElseIf Status = ThrowStatus.Pass Then 
       Return "PASS" 
      ElseIf Status = ThrowStatus.Foul Then 
       Return "FOUL" 
      Else 
       Return Nothing 
      End If 

     End Get 
     Set(value As String) 
      If (value > 0) Then 


       If (IsNumeric(value)) Then 
        m_Distance = value 
        Status = ThrowStatus.Valid 
       ElseIf (value = "foul") Then 
        Status = ThrowStatus.Foul 
       ElseIf (value = "pass") Then 
        Status = ThrowStatus.Pass 
       Else 
        Status = ThrowStatus.Valid 
        m_Distance = Nothing 
       End If 
      Else 
       m_Distance = Nothing 
       Status = ThrowStatus.Valid 
      End If 
      OnPropertyChanged("Distance") 
     End Set 
    End Property 
    Protected Sub OnPropertyChanged(ByVal name As String) 
     RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(name)) 
    End Sub 
    Private m_Distance As Decimal 
    Public Property attempt() As Integer 
     Get 
      Return m_attempt 
     End Get 
     Set(value As Integer) 
      m_attempt = value 
     End Set 
    End Property 
    Private m_attempt As Integer 

End Class

을 다음과 같이 클래스는 다음과 같이 라벨에 대한 databinds 라인은 다음과 같습니다

는 는 는 내가 속성 BestThrow이 defintely 시계를 사용하여 업데이트되고 있음을 알 수 있습니다

그러나 어떤 이유로 라벨 보인다


best.DataBindings.Add(New Binding("text", athlete.BestThrow, "distance", False, DataSourceUpdateMode.OnPropertyChanged)) 
(0) 던지기 만 반영하십시오 .Distance가 아닌 BestThrow.Distance

다른 5 개의 시도 중 더 많은 숫자를 추가하면 Throw (0) 및 레이블이 바뀔 수 있으며 가능한 값을 봅니다. BestThrow가 업데이트되고 있는지 확인하십시오.

미리 도움을 주셔서 감사합니다. 가 더 세터가 없기 때문에

마크

답변

0

난 당신이 잘못된 prespective 있다고 생각, 재산 BestThrow가 업데이트되지 않습니다. 시계를 사용하여 BestThrow 값을 확인할 때 값을 요청하기 때문에 '다시 계산'됩니다. 필요한 것은 Throws 값이 Throws에 달려 있기 때문에 에 대한 항목 변경 또는 추가 이벤트가 발생했을 때마다 속성 변경 이벤트를 발생시키는 방법을 찾는 것입니다. 이벤트 발생 후 UI는 BestThrow's getter에게 다시 업데이트 된 값을 요청합니다. 이벤트를 Raisng

'You need to execute this code to notify UI that `BestThrow` value has changed 
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("BestThrow")) 

는 추가/Throws 속성에서로/항목을 제거하기위한 코드 후 수동으로 수행 할 수 있습니다, 또는 당신은 ThrowsThrow의 ObservableCollection에 다음 컬렉션 변경된 이벤트를 수신 할 수 있습니다. 그런 다음 이벤트 핸들러에서 BestThrow 속성 변경 이벤트를 발생시킬 수 있습니다.

+0

도움 주셔서 감사합니다. Throw가 설정된 경우 UI를 트리거하여 값을 업데이트 할 수있을만큼의 이벤트를 발생 시키거나 어떻게 든 BestThrow의 PropertyChangedEvent를 적극적으로 수신 대기하도록 레이블을 설정해야합니까? – mrtechguy

+0

이벤트를 발생시키는 것으로 충분합니다. 어떻게 데이터 바인딩이 작동하는지. 데이터 바인딩 UI를 사용할 때 속성 값이 변경되었다는 알림을 받으면 속성 값이 업데이트 될 때마다 UI가 업데이트됩니다. 속성 변경 이벤트 발생은 UI에 알리는 방법입니다. – har07

+0

변경 사항을 적용하면 레이블이 새로 고쳐 지지만 첫 번째 필드 만 변경됩니다. 따라서 3 스로우가 들어 있고 두 번째가 가장 먼 경우 첫 번째 거리가 변경 될 때까지 두 번째 거리가 표시되지 않습니다 (다른 모든 거리보다 적은 거리로 첫 번째 거리를 변경하더라도) – mrtechguy

관련 문제