2017-10-10 3 views
0

J'ai une classe personnalisée qui implémente INotifyPropertyChanged comme suit (propriétés étrangères et répétées enlevé):Databound TextBox pas mise à jour avec Source

Public Class Map 
     Implements INotifyPropertyChanged 

     Private _wages As Decimal 
     Property Wages As Decimal 
      Get 
       Return _wages 
      End Get 
      Set(value As Decimal) 
       Debug.Print("Event Raised: " & _wages & " " & value) 
       _wages = value 
       RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(Wages)) 
      End Set 
     End Property 

Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged 

La classe est en cours de sérialisation/désérialisée correctement. Lorsque je charge le fichier XML, le TextBox qui affiche le salaire n'est pas mis à jour pour refléter la valeur des salaires.

J'ai les (DevExpress) TextBox DataBindings serties:

txtWages.DataBindings.Add(New Binding("EditValue", mymap, "Wages", False, DataSourceUpdateMode.OnPropertyChanged)) 

Quand je charge le fichier que je peux voir l'ancienne et la nouvelle valeur de Debug.Print:

événement actuel: 0 13

Cependant, txtWages séjours à 0

J'ai lu ces réponses Here et Here et essayé de chercher des idées, mais je suis à court d'idées.

EDIT: Il semble que si je remplis la classe avec le XML désérialisé puis que je règle les liaisons, cela fonctionne, mais pas lorsque les liaisons sont définies en premier. J'aurais pensé que ça marcherait dans les deux cas.

Répondre

1
  1. Vous devez fournir le nom de la propriété à la PropertyChangedEventArgs

    RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(Nameof(Wages)) 
    
  2. Vous ne l'avez pas affiché, mais il est évident que lorsque vous chargez un fichier et désérialisez une classe, vous créez une nouvelle instance de Map et la définissez sur mymap. Où la liaison de contrôle se référera toujours à l'instance d'origine et écouter ses événements.

Créer viewmodel « wrapper » avec propriété de type Map et augmenter l'événement de changement de propriété lorsque vous chargez le fichier.

Public Class ViewModel 
    Private _Map As Map 
    Property Map As Map 
     Get 
      Return _Map 
     End Get 
     Set(value As Map) 
      _Map = value 
      RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(Nameof(Wages)) 
     End Set 
    End Property 
End Class 

ensuite sous la forme ne liant

Dim viewmodel = new ViewModel() 
viewmodel.Map = DeserializeMap() ' Your deserialize logic 
txtWages.DataBindings.Add("EditValue", 
          viewmodel, 
          "Map.Wages", 
          False, 
          DataSourceUpdateMode.OnPropertyChanged) 
+0

'MyMap' est déclaré avant le sous-objet' New'. Le code à désérialiser est: 'MyMap = BM.Utilities.FileHelper.Deserialize (Of Map) (" Routes.xml ")' sûrement c'est la même instance? –

+1

La désérialisation crée une nouvelle instance de type 'Map'. – Fabio

2

U ont erreur dans le code

PropertyChangedEventArgs besoin String (Nom de la propriété)

donc "salaire"

RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("Wages")) 
+0

J'ai remarqué que moi aussi. Même en passant le nom de la propriété plutôt que la valeur de la propriété, il ne sera pas mis à jour à moins que je ne mette la liaison après que la classe ait été remplie. –

+0

utilisez donc Property Set pour l'objet Map et lorsque vous remplissez un nouvel objet, vous pouvez facilement relier le contrôle de formulaire –