Question

J'ai une simple question mise en liaison de données dans les deux sens d'une case à cocher dans Silverlight 3.0. Il doit être une évidence, mais probablement j'ai oublié ma maison de cerveau aujourd'hui ...

Je défini une classe de modèle pour représenter ma .. « données ». Je mis en œuvre 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>

Ensuite, 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 / décocher à moins que je de-Mettre en oeuvre le INotifyPropertyChanged. Si de-mettre en œuvre cependant, l'interface utilisateur ne remarque pas si je change les données sous-jacentes.

Si je supprime le mode = bit TwoWay de l'expression de liaison IsChecked alors aussi l'interface utilisateur ne remarquera pas la modification des données sous-jacentes, même si le modèle met en œuvre l'interface.

Comment puis-je faire pour:

  1. Avoir la case liée aux données au démarrage
  2. Avoir la case à cocher isChecked changer pour modifier les données sous-jacentes
  3. Avez la case à cocher détecter le changement de données sous-jacentes et de se mettre à jour?
Était-ce utile?

La solution

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

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

    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top