2

J'ai un problème simple de définition d'une liaison de données bidirectionnelle d'une case à cocher dans Silverlight 3.0. Il doit être une évidence, mais j'ai probablement oublié mon cerveau à la maison aujourd'hui ...Silverlight checkbox la liaison bidirectionnelle ne fonctionne pas comme prévu

J'ai défini une classe modèle pour représenter mes .. 'données'. J'ai implémenté l'interface INotifyPropertyChanged pour permettre à l'interface utilisateur de voir quand les données changent.

public class Model : INotifyPropertyChanged 
{ 
    private bool _value; 
    public bool Value 
    { 
     get { return this._value; } 
     set 
     { 
      if (this.PropertyChanged != null) 
       this.PropertyChanged(this, new PropertyChangedEventArgs("Value")); 
      this._value = value; 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

Ensuite, je mis une case à cocher et un bouton sur la .. 'forme':

<StackPanel Orientation="Horizontal"> 
     <CheckBox x:Name="check" IsChecked="{Binding Value, Mode=TwoWay}" Content="SomeLabel"/>  
     <Button Click="Button_Click" Content="Test" /> 
    </StackPanel> 

Je fourni les données dans le constructeur:

public MainPage() 
    { 
     InitializeComponent(); 

     this.DataContext = new Model() { Value = true }; 
    } 

Le problème est que vous devez cliquer deux fois sur la case à cocher pour qu'elle cocher/décocher sauf si je désimplémente l'INotifyPropertyChanged. Si vous le désactivez, l'interface utilisateur ne remarque pas si je modifie les données sous-jacentes.

Si je supprime le bit Mode = TwoWay de l'expression de liaison IsChecked, l'interface utilisateur ne remarquera pas non plus les données sous-jacentes, même si le modèle met en œuvre l'interface.

Comment puis-je faire pour:

  1. avons la case liée aux données au démarrage
  2. ont le changement case isChecked pour modifier les données sous-jacentes
  3. avez la case à cocher détecter le changement de données sous-jacentes et se mettre à jour?

Répondre

8

Vous avez une erreur de séquençage dans votre procédure de propriété définie, vous devez attribuer à _valueavant notification au changement: -

set 
    { 
     this._value = value; 
     if (this.PropertyChanged != null) 
      this.PropertyChanged(this, new PropertyChangedEventArgs("Value")); 

    } 
+0

Merci !!! Ça a marché. Je t'ai dit que j'avais oublié mon cerveau à la maison aujourd'hui :)) –

Questions connexes