2014-01-06 3 views
0

У меня возникают проблемы с меткой с обновлением текстового значения базы данных. У меня есть класс, который вычисляет лучший бросок спортсмена, и это связано с меткой в ​​моей форме. Класс следующим образомVB.NET Databound Label не обновляется

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 для этикетки выглядит следующим образом:


best.DataBindings.Add(New Binding("text", athlete.BestThrow, "distance", False, DataSourceUpdateMode.OnPropertyChanged)) 

Я могу сказать, что свойство BestThrow является Defintely обновляется с помощью Watch, однако по некоторым причинам этикетка кажется (0) .Distance, а не BestThrow.Distance

Я могу изменить Throw (0), и метка изменится, если я добавлю большее число к любой из других 5 попыток и наблюдаю за значением, которое могу посмотрите, что обновляется BestThrow.

Заранее благодарю вас за помощь.

Марк

ответ

0

Я думаю, что у вас есть неправильный prespective, свойство BestThrow никогда не обновляется, так как он не имеет сеттера. Когда вы устанавливаете значение BestThrow с использованием часов, оно «пересчитывается», потому что вы запрашиваете значение. Вам нужно найти способ повысить событие Property Changed для BestThrow всякий раз, когда элемент добавляется или удаляется с , потому что значение BestThrow зависит от Throws. После поднятого события пользовательский интерфейс вызовет BestThrow's геттер, снова ищет обновленную стоимость.

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

Raisng событие может быть сделано вручную, после того, как код для добавления/удаления элемента в/из Throws собственности, или вы можете сделать Throws ObservableCollection из Throw затем слушать коллекции Changed события. Затем в обработчике события вы можете поднять BestThrow измененное событие.

+0

Благодарим вас за помощь. Возникло ли событие, когда установлен Throw, достаточно, чтобы заставить пользовательский интерфейс обновить значение или мне нужно каким-то образом настроить ярлык для активного прослушивания PropertyChangedEvent для BestThrow? – mrtechguy

+0

Поднять мероприятие должно быть достаточно. Вот как работает привязка данных. При использовании интерфейса привязки данных будет обновляться всякий раз, когда значение свойства, которое оно привязано к обновлению, до тех пор, пока оно получает уведомление о том, что значение свойства изменилось. И событие с изменением свойства - способ уведомления UI – har07

+0

После внесения этих изменений он обновит ярлык, но только при первом изменении поля. Поэтому, если у меня есть 3 броска, а второй - самый дальний, он не отобразит 2-е расстояние, пока я не изменю 1-е расстояние (даже если я изменил первое расстояние до меньшего, чем все остальные расстояния) – mrtechguy

Смежные вопросы