데이터 바인딩 된 텍스트 값을 업데이트하는 레이블에 문제가 있습니다. 운동 선수의 최고 던지기를 계산하는 클래스가 있는데이 클래스는 내 양식의 레이블에 바인딩되어 있습니다.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가 업데이트되고 있는지 확인하십시오.
미리 도움을 주셔서 감사합니다. 가 더 세터가 없기 때문에
마크
도움 주셔서 감사합니다. Throw가 설정된 경우 UI를 트리거하여 값을 업데이트 할 수있을만큼의 이벤트를 발생 시키거나 어떻게 든 BestThrow의 PropertyChangedEvent를 적극적으로 수신 대기하도록 레이블을 설정해야합니까? – mrtechguy
이벤트를 발생시키는 것으로 충분합니다. 어떻게 데이터 바인딩이 작동하는지. 데이터 바인딩 UI를 사용할 때 속성 값이 변경되었다는 알림을 받으면 속성 값이 업데이트 될 때마다 UI가 업데이트됩니다. 속성 변경 이벤트 발생은 UI에 알리는 방법입니다. – har07
변경 사항을 적용하면 레이블이 새로 고쳐 지지만 첫 번째 필드 만 변경됩니다. 따라서 3 스로우가 들어 있고 두 번째가 가장 먼 경우 첫 번째 거리가 변경 될 때까지 두 번째 거리가 표시되지 않습니다 (다른 모든 거리보다 적은 거리로 첫 번째 거리를 변경하더라도) – mrtechguy