2010-08-25 8 views
0

Après une interruption de mon application Silverlight/F #, je recommence et je rencontre un problème que je n'arrive pas à comprendre. J'ai une variable membre de mon usercontrol qui est un ref de liste, sur les clics de bouton je veux ajouter des disques à lui - mais il ne met jamais à jour. Je suis assez sûr que cela a à voir avec être membre, mais je n'ai pas compris.liste des membres ref pas de mise à jour

Merci d'avance à ceux qui prennent le temps de voir et de répondre.

les lignes de problème:

. 
. 
. 
member this.brokers = ref List.empty 
. 
. 
. 
// this line doesn't seem to work 
this.brokers := candidate :: (!this.brokers) 
. 
. 
. 

la classe:

type Page() as this =  
    inherit UriUserControl("/xyz;component/page.xaml", "page") 
    do 
     this.firm.ItemsSource <- RpcXYZ.getFirms() 
     this.email.Background <- SolidColorBrush(Colors.Red) 
     this.addBtn.IsEnabled <- false 
     () 

    // instance data 
    member this.brokers = ref List.empty 

    // bound controls for add candidate 
    member this.FE : FrameworkElement = (this.Content :?> FrameworkElement) 
    member this.fname : TextBox = this.FE ? fname 
    member this.lname : TextBox = this.FE ? lname 
    member this.email : TextBox = this.FE ? email 
    member this.firm : RadComboBox = this.FE ? firms 
    member this.addBtn : RadButton = this.FE ? addBtn 

    member this.addCadidate_Click (sender : obj) (args : RoutedEventArgs) = 
     let inline findFirm (f : RpcXYZ.firm) = 
      f.id = Int32.Parse(this.firm.SelectedValue.ToString()) 

     let candidate : SalesRep = { 
      id = -1 ; 
      fname = this.fname.Text ; 
      lname = this.lname.Text ; 
      email = this.email.Text ; 
      phone = "" ; 
      firm = List.find findFirm <| RpcXYZ.getFirms(); 
      score = None ; 
     } 

     // this line is fine t is a list of 1 item after 1 click 
     let t = candidate :: (!this.brokers) 

     // this line doesn't seem to work 
     this.brokers := candidate :: (!this.brokers) 

     ChildWindow().Show() |> ignore ; 

    member this.email_Changed (o : obj) (arg : TextChangedEventArgs) = 
     let txtBox = (o :?> TextBox) 
     let emailRegex = Regex("(\w[-._\w]*\[email protected]\w[-._\w]*\w\.\w{2,3})") 
     if emailRegex.IsMatch(txtBox.Text) = false then 
      txtBox.Background <- SolidColorBrush(Colors.Red) 
      this.addBtn.IsEnabled <- false 
     else 
      txtBox.Background <- new SolidColorBrush(Colors.White) 
      this.addBtn.IsEnabled <- true 

Répondre

3

Ce

member this.brokers = ref List.Empty 

définit un getter de la propriété. Chaque fois que vous touchez .brokers, il ré-exécute le code sur le côté droit. C'est le problème.

Le correctif serait de définir une variable d'instance, et le retour que:

let brokers = ref List.Empty 
member this.Brokers = brokers 

Puis un ref est attribué lorsqu'une instance de la classe est construit, et vous gardez l'accès à ce même objet ref via le propriété du membre.

+0

Eh bien des chapeaux pas ce que je veux! Déjà fait le changement, merci – akaphenom

3

Brian a déjà expliqué le problème. Cependant, y a-t-il une raison pour laquelle vous n'utilisez pas un membre mutable (avec getter et setter) et utilisez plutôt un membre readonly qui retourne une cellule de référence?

L'utilisation d'un get/membre du jeu serait une solution plus idiomatiques:

let mutable brokers = List.Empty 

member this.Brokers 
    with get() = brokers 
    and set(value) = brokers <- value 

La déclaration est un peu plus longue (! Malheureusement, il n'y a pas de propriétés automatiques en F #), mais le membre ressemblera à une norme propriété (à la fois F # et C#). Vous pouvez alors l'utiliser comme ceci:

x.Brokers <- candidate :: x.Brokers 

Bien que, vous avez besoin de la propriété que pour les membres du public qui devraient être accessibles à partir de l'extérieur du type. Pour les champs privés, vous pouvez simplement utiliser la valeur mutable brokers directement ...

+0

J'ai vraiment eu trop de zèle avec le modificateur de membre. Je n'ai pas vraiment besoin de ces membres publics, juste des instances privées. Probablement devrait être mutable au lieu de ref cependant. – akaphenom

Questions connexes